Laravel 4 Auth::attempt($userdata, false) аутентификация по-прежнему сохраняется

Недавно я решил добавить функцию «запомнить меня» в свое приложение Laravel 4. Был найден подходящий метод с синтаксисом:

Auth::attempt(array $credentials = array(), $remember = false)

Это было принято для моих нужд так:

Auth::attempt($userdata, Input::has('remember'))

Приложение сохраняло сеанс аутентификации, и пользователь аутентифицировался даже после закрытия браузера.

Хотя я обнаружил, что теперь Laravel всегда аутентифицирует пользователя, независимо от того, в каком состоянии стоит галочка «запомнить».

Я пытался сделать:

Auth::attempt($userdata, false)

и

Auth::attempt($userdata,)

Пользователь все еще был аутентифицирован во время сеансов браузера!!! Теперь, поскольку Auth::attempt($userdata) не поддерживает сеанс аутентификации, я чувствовал, что всякий раз, когда есть указания на второй аргумент в методе Auth::attempt, Laravel автоматически принимает его как «истинный». Кто-нибудь может это прояснить?

РЕДАКТИРОВАТЬ: Чтобы всем было понятно, я перечислю шаги для воссоздания этого поведения:

  1. Выход из приложения Auth::logout();
  2. Войдите снова Auth::attempt($userdata, false)
  3. Закройте и откройте браузер
  4. Перейдите по ссылке приложения.
  5. Приложение загружено, аутентифицировано

Это мой первый вопрос, поэтому, пожалуйста, будьте терпеливы со мной :)


person ITDesigns.eu    schedule 15.11.2013    source источник


Ответы (1)


РЕДАКТИРОВАТЬ: OP ясно дал понять, что назвал Auth::logout() правильно, поэтому ответ отредактирован, чтобы включить «настоящий» ответ.

Установите значение lifetime в app/config/session/php на 0, чтобы файлы cookie очищались при закрытии браузера.

Предыдущий ответ

Это метод login в классе Illuminate\Auth\Guard (который фасаден для Auth), который в конечном итоге вызывается Auth::attempt().

источник: http://laravel.com/api/source-class-Illuminate.Auth.Guard.html#263-291

 public function login(UserInterface $user, $remember = false)
 {
     $id = $user->getAuthIdentifier();

     $this->session->put($this->getName(), $id);

     // If the user should be permanently "remembered" by the application we will
     // queue a permanent cookie that contains the encrypted copy of the user
     // identifier. We will then decrypt this later to retrieve the users.
     if ($remember)
     {
         $this->queuedCookies[] = $this->createRecaller($id);
     }

     // If we have an event dispatcher instance set we will fire an event so that
     // any listeners will hook into the authentication events and run actions
     // based on the login and logout events fired from the guard instances.
     if (isset($this->events))
     {
         $this->events->fire('auth.login', array($user, $remember));
     }

     $this->setUser($user);
 }

Понятно, что даже несмотря на то, что файл cookie установлен, когда $remember установлен на true, сам файл cookie не очищается, когда $remember установлен на false или другое неверное значение.

Файл cookie очищается при вызове функции Auth::logout().

person tharumax    schedule 15.11.2013
comment
Спасибо за ответ, я просто не уверен, что вы имеете в виду - я говорю о чистом входе в систему без каких-либо заранее установленных файлов cookie. - person ITDesigns.eu; 15.11.2013
comment
Звонили ли вы logout() после предыдущего входа в систему? - person tharumax; 15.11.2013
comment
Какое значение в lifetime в app/config/session.php? Вы должны установить его на 0, если хотите очищать файлы cookie при закрытии браузера. - person tharumax; 15.11.2013
comment
Прямо на месте! Я установил его на 120 давным-давно и забыл об этом! Теперь все в порядке! СПАСИБО! Можете ли вы отредактировать свой ответ, включив в него решение на случай, если кто-то другой с такой же проблемой придет искать? :) - person ITDesigns.eu; 15.11.2013
comment
Установка lifetime на 0 запуталась с другими функциями на основе сеанса в моем приложении, такими как ошибки проверки, передаваемые в представление, и т. д. Будьте осторожны при его использовании, я думаю, что время жизни 60 минут (когда пользователь не хочет, чтобы его помнили , или не поставил галочку в окошке запомнить меня) примерно так. Я не знаю, в какой версии это было реализовано, но есть параметр expire_on_close, который должен делать то, что мы хотим, чуть ниже lifetime. - person ryancey; 04.07.2014