У меня есть приложение с аутентификацией пользователя с базой данных. Имущество, которое я использую, – это электронная почта:
providers: administrators: entity: class: CorabMainBundle:User property: email
Аутентификация отлично работает! Но у меня есть огромные проблемы, чтобы вспомнить, как я работаю. Через несколько часов я думаю, что нашел проблему, но я не знаю, как ее решить …
Кажется, что Symfony2 пытается аутентифицироваться с именем пользователя, а не электронной почтой, если вы меня помните.
dev.log говорит следующее:
[2013-10-21 23:49:19] security.DEBUG: Remember-me cookie detected. [] [] [2013-10-21 23:49:19] doctrine.DEBUG: SELECT t0.id AS id1, t0.username AS username2, t0.salt AS salt3, t0.password AS password4, t0.email AS email5, t0.is_active AS is_active6, t0.organisation AS organisation7 FROM User t0 WHERE t0.email = ? LIMIT 1 ["roger"] [] [2013-10-21 23:49:19] security.INFO: User for remember-me cookie not found. [] [] [2013-10-21 23:49:19] security.DEBUG: Clearing remember-me cookie "REMEMBERME" [] []
Строка 2 не в порядке, это не должно быть roger, а адрес электронной почты . Вот почему cookie удаляется.
Как сказать symfony2 использовать электронную почту как свойство для запоминания моей аутентификации?
Спасибо за помощь!
Вы можете расширить класс обслуживания по умолчанию для меня и переопределить метод onLoginSuccess, чтобы он использовал электронную почту вместо имени пользователя.
Или вы можете вернуть электронное письмо в функцию getUsername () и изменить имя своего реального поля имени пользователя, например «nickname».
public function getUsername() { return $this->email; }
Когда вы реализуете UserInterface , комментарий UserInterface.php говорит
/** * Returns the username used to authenticate the user. * * @return string The username */ public function getUsername();
Да, это «плохо», но менее многословно. Реальная проблема – это имя этой проклятой функции. Symfony2 должен изменить его.
В моем случае я только что изменил cookie «memorme» и заменил имя пользователя по электронной почте следующим образом:
if(userJustLogin) { // decode cookie $request = $this->getRequest(); $cookies = $request->cookies->all(); $cookieParts = explode(':', base64_decode($cookies["REMEMBERME"])); // replace username by email and update hash list($class, $username, $expires, $hash) = $cookieParts; $cookieParts[1] = base64_encode($user->getMail()); $cookieParts[3] = hash_hmac('sha256', $class.$user->getMail().$expires.$user->getPassword(), 'YourSecretTokenFromParameters.yml'); // reencode cookie $cookies["REMEMBERME"] = base64_encode(implode(':', $cookieParts)); $cookie = new Cookie('REMEMBERME', $cookies["REMEMBERME"], $expires); // send new cookie $response = new Response(); $response->headers->setCookie($cookie); $response->send(); }