2015-04-14 4 views
12

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

ли Laravel имеет некоторую ошибку в системе Auth, пожалуйста, предложить, спасибо

+0

, как вы знаете, что сессия уничтожается или нет? Вы ограничили маршруты с помощью auth? –

+0

@sgt После того, как я нажму ссылку на выход, я не могу посетить '/ auth/login', он просто перенаправляет меня на панель. – seoppc

+0

У меня была такая же проблема, моя ошибка была поставлена ​​промежуточным словом «гость» на маршрут выхода из системы. :/ Возможно, у вас такая же проблема. –

ответ

0

В вашем случае вы, вероятно, не достигающего метод выхода из системы(). Если вы используете механизм авторизации 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('/'); 
} 
+0

Да, я вижу «выход из системы» на экране после ссылки на выход из системы, что означает, что ссылка на выход ударяет по этой функции. – seoppc

+0

Другим вариантом может быть то, что вы запомнили свою учетную запись. Проверьте статус входа в систему до и после выхода из системы(). Вы можете использовать dd ($ this-> auth-> user()); для этого. Это точно покажет вам, был ли пользователь вошел в систему или нет после выхода из системы –

+0

просто попробовал этот тест, получив пустой после вызова, так что это означает его уничтожение 'auth-> user()', но почему страница входа перенаправляется на панель мониторинга даже после выхода из системы. – seoppc

13

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

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

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

+0

В настоящее время я использую Larvel 5 builting auth mechan – seoppc

+1

Так что я надеюсь, что вы сможете уничтожить сеанс сейчас? – Amita

+0

У меня была такая же проблема, моя ошибка была поставлена ​​промежуточным словом «гость» на маршрут выхода из системы. :/ Возможно, у вас такая же проблема. –

0

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

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

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

return redirect($redirectAfterLogout) 
0

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

1

Похоже, что в /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 »);

+0

Это решение для Laravel 5.2.29. Возможно, версии имеют небольшие изменения за кулисами. –

6

Используя 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(); 
} 
+0

У меня была такая же проблема, моя ошибка была поставлена ​​промежуточным словом «гость» на маршрут выхода из системы. :/ Возможно, у вас такая же проблема. –

0

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

/** 
* 
* 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(); 
} 
1

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

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

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

Так что удаление этих неответных запросов сработало для меня. Я надеюсь, что этот ответ поможет :)

+0

Где удалить эти запросы без ответа? – leonardeveloper

+0

В моем случае я нашел эти запросы в некоторых вызовах JQuery ajax, поэтому я просто удалил этот код, а затем выход из системы начал работать должным образом. Надеюсь, я справлюсь с этим :) – dani24

1

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

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

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

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

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

Trait AuthenticatesUsers

public function logout(Request $request) 

изменить это

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

к этому

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

Это сработало. Благодарю. –

Смежные вопросы