Intereting Posts
Как конвертировать запрос агрегации MongoDB в Laravel MongoDB от jenssegers Должен ли я регенерировать_session_id на каждой странице? регулярное выражение для валюты (евро) Вызов функции непосредственно после конструктора: new Object () -> callFunction () Как установить автоматическую высоту в phpexcel? Codeigniter 2 ограничивает контроллер командной строкой Как запустить PHP-код асинхронный Выбор раскрывающегося списка на основе записей в базе данных Вставить партию в Laravel 5 Предупреждение: implode () : Пропущенные недопустимые аргументы SQLSTATE : Недопустимый номер параметра: количество связанных переменных не совпадает с числом токенов в строке 102 Доступ к константам класса из экземпляра, хранящегося в другом классе Php reg exp: соответствие повторяющейся схеме Как правильно печатать переменную в журнале ошибок php Mysql. Заказывать места и собирать списки в случайном порядке

Symfony2: «Запомнить меня» пытается аутентифицироваться по имени пользователя по электронной почте

У меня есть приложение с аутентификацией пользователя с базой данных. Имущество, которое я использую, – это электронная почта:

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, чтобы он использовал электронную почту вместо имени пользователя.

  • Расширение службы : security.authentication.rememberme.services.simplehash.class
  • Класс: Symfony \ Component \ Security \ Http \ RememberMe \ TokenBasedRememberMeServices
  • Метод: 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(); }