Laravel 5 Auth Logout не уничтожает сеанс

Я использую систему Laravel5 Auth для моего нового проекта, я могу использовать функции регистрации и входа в систему без каких-либо проблем, но выход из системы не работает должным образом, однако я перенаправляюсь на url, указанный в $redirectAfterLogout но он не разрушает сеанс, поэтому даже после нажатия кнопки выхода из системы я могу видеть панель приборов.

У laravel есть ошибка в системе Auth, пожалуйста, предлагайте, спасибо

Вы не предоставили какой-либо фрагмент кода, который вы использовали. Однако работает следующий код:

 public function getLogout(){ Auth::logout(); Session::flush(); return Redirect::to('/'); } из public function getLogout(){ Auth::logout(); Session::flush(); return Redirect::to('/'); } 

Session::flush(); очищает все существующие сеансы.

Используя Laravel 5.2, я зарегистрировал прослушиватель, обработал событие выхода из системы и назвал Session :: flush, как было предложено выше. Казалось, что он работает очень хорошо. Надеюсь, это полезно.

EventServiceProvider.php

 protected $listen = [ 'App\Events\SomeEvent' => [ 'App\Listeners\EventListener', ], 'Illuminate\Auth\Events\Logout' => [ 'App\Listeners\ClearSessionAfterUserLogout' ], ]; 

ClearSessionAfterUserLogout.php

 public function handle(Logout $event) { Session::flush(); } 

Кажется, что в /vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php … функция getLogout () никогда не достигается, поэтому метод logout () никогда не срабатывает.

В моем случае в моем /app/Http/routes.php … вместо этого «Route :: get (« auth / logout »,« Auth \ AuthController @ getLogout »); Я изменил его на: «Route :: get (« auth / logout »,« Auth \ AuthController @ logout »);

У меня была одна и та же проблема, и я все испробовал, но в конце концов смог ее исправить.

Моя проблема заключалась в том, что когда я нажал кнопку выхода из системы, до этого у меня было несколько HTTP-запросов, на которые еще не было ответа, поэтому даже когда пользователь вышел из системы, позже с ответом на ожидающие запросы он снова вошел в систему. Вот пример:

 Another Request | *********************************** Logout Request | ******************** | Time | --|------|-------------------|------|------> t1 t2 t3 t4 

Таким образом, снятие этих ответов без ответа сработало для меня. Надеюсь, что этот ответ поможет 🙂

Я переключился на драйвер сеанса базы данных и использовал следующий код в своем действии выхода из системы

 $request->session()->getHandler()->destroy($request->session()->getId()); 

Вы можете просто переопределить метод выхода в AuthController.php

Вот пример кода:

 public function logout(){ Session::flush(); Auth::guard($this->getGuard())->logout(); return redirect(property_exists($this, 'redirectAfterLogout') ? $this->redirectAfterLogout : '/'); } из public function logout(){ Session::flush(); Auth::guard($this->getGuard())->logout(); return redirect(property_exists($this, 'redirectAfterLogout') ? $this->redirectAfterLogout : '/'); } 

В вашем случае вы, вероятно, не достигли метода logout (). Если вы используете механизм авторизации Laravel 5, вы запустите метод getLogout () для аутентификации AuthenticatesAndRegistersUsers, который делает $this->auth->logout();

Найдите этот код, отредактируйте метод, как показано ниже, для отладки. Если вы видите строку «Выход из системы», вы должны выйти из системы. Что-то не так с вашей маршрутизацией, и выход из системы просто не выполняется.

 /** * Log the user out of the application. * * @return \Illuminate\Http\Response */ public function getLogout() { dd("Logging out"); $this->auth->logout(); return redirect('/'); } из /** * Log the user out of the application. * * @return \Illuminate\Http\Response */ public function getLogout() { dd("Logging out"); $this->auth->logout(); return redirect('/'); } 

Я боролся с этим, и я пришел к решению.

Короче говоря: сеанс Laravel читает и пишет с помощью промежуточного программного обеспечения. Он считывает сохраненный сеанс в начале запроса и записывает любые изменения в конце запроса. Если вы сделаете переадресацию, то текущий запрос никогда не завершится, а запись промежуточного программного обеспечения не произойдет.

Итак, как это исправить? В зависимости от вашей реализации … вы должны return команду перенаправления, а не называть ее напрямую.

 return redirect($redirectAfterLogout) 

Я столкнулся с подобной проблемой, и оказалось, что с помощью драйвера «файла» для сеансов каким-то образом сервер создавал файлы, которые он не мог изменить позже, но не было предупреждений о разрешении файлов. Я переключился на реализацию redis, поэтому, к сожалению, не могу сказать, как исправить проблему создания файла, но подумал, что это может сэкономить некоторое время.

Принимая объект запроса в действии контроллера (не забудьте добавить это после объявления пространства имен контроллера: используйте Auth; ):

  /** * * Render page * * @route POST /user/{user_id}/logout * * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ public function logout(Request $request) { Auth::logout(); $request->session()->flush(); } из  /** * * Render page * * @route POST /user/{user_id}/logout * * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ public function logout(Request $request) { Auth::logout(); $request->session()->flush(); } 

свойство AuthenticatesUsers

 public function logout(Request $request) 

изменить это

 $request->session()->regenerate(); 

к этому

 $request->session()->regenerate(true);