Как выйти из системы и переадресовать ее на страницу входа в систему с помощью Laravel 5.4?
Я использую Laravel 5.4 и пытаюсь внедрить систему аутентификации. Я использовал команду php artisan make: auth для ее настройки. Я отредактировал представления в соответствии с моим расположением. Теперь, когда я пытаюсь выйти из системы, я выбрал эту ошибку
NotFoundHttpException в строке RouteCollection.php 161:
может ли кто-нибудь помочь мне выйти из системы?
Ответы
Ответ 1
В вашем web.php
(маршрутах):
добавить:
Route::get('logout', '\App\Http\Controllers\Auth\[email protected]');
В LoginController.php
добавить:
public function logout(Request $request) {
Auth::logout();
return redirect('/login');
}
Кроме того, в верхней части LoginController.php
, после namespace
добавить:
use Auth;
use Illuminate\Http\Request;
Теперь вы можете выйти с помощью yourdomain.com/logout
URL или если вы создали logout button
, добавьте href в /logout
Ответ 2
Ну, даже если то, что предлагает @Tauras, просто работает, я не думаю, что это правильный способ справиться с этим.
Вы сказали, что запустили php artisan make:auth
, который также должен был вставить Auth::routes();
в ваши файлы маршрутизации routes/web.php
. Который идет с уже заданным маршрутом по умолчанию logout
и называется logout
.
Вы можете увидеть его здесь на GitHub, но я также сообщу здесь код для простоты:
/**
* Register the typical authentication routes for an application.
*
* @return void
*/
public function auth()
{
// Authentication Routes...
$this->get('login', 'Auth\[email protected]')->name('login');
$this->post('login', 'Auth\[email protected]');
$this->post('logout', 'Auth\[email protected]')->name('logout');
// Registration Routes...
$this->get('register', 'Auth\[email protected]')->name('register');
$this->post('register', 'Auth\[email protected]');
// Password Reset Routes...
$this->get('password/reset', 'Auth\[email protected]')->name('password.request');
$this->post('password/email', 'Auth\[email protected]')->name('password.email');
$this->get('password/reset/{token}', 'Auth\[email protected]')->name('password.reset');
$this->post('password/reset', 'Auth\[email protected]');
}
Снова обратите внимание, что logout
требует POST
в качестве метода HTTP-запроса. Для этого есть много веских причин, но стоит упомянуть одну очень важную: таким образом вы можете предотвратить подделку межсайтовых запросов.
Таким образом, согласно тому, что я только что указал, правильный способ реализации этого может быть следующим:
<a href="{{ route('logout') }}" onclick="event.preventDefault(); document.getElementById('frm-logout').submit();">
Logout
</a>
<form id="frm-logout" action="{{ route('logout') }}" method="POST" style="display: none;">
{{ csrf_field() }}
</form>
И наконец, обратите внимание, что я вставил функцию "готовый" из коробки "{{ csrf_field() }}
!
Ответ 3
В контроллере вы можете использовать следующее:
return redirect('login')->with(Auth::logout());
Ответ 4
вот еще один способ сделать это, вызвав Auth:: logout() в маршруте
Route::get('/logout', function(){
Auth::logout();
return Redirect::to('login');
});
Ответ 5
В 5.5
добавление
Route::get('logout', 'Auth\[email protected]');
для моего файла маршрутов работает нормально.
Ответ 6
Я рекомендую придерживаться маршрутов аутентификации Laravel в web.php: Auth::routes()
Это создаст следующий маршрут:
POST | logout | App\Http\Controllers\Auth\[email protected]
Вам необходимо выйти из системы, используя форму POST. Таким образом, вам также понадобится токен CSRF, который рекомендуется.
<form method="POST" action="{{ route('logout') }}">
@csrf
<button type="submit">Logout</button>
</form>
Ответ 7
Лучший способ для Laravel 5.8
100% работал
Добавьте эту функцию в свой Auth\LoginController.php
use Illuminate\Http\Request;
А также добавьте это
public function logout(Request $request)
{
$this->guard()->logout();
$request->session()->invalidate();
return $this->loggedOut($request) ?: redirect('/login');
}
Ответ 8
Если вы использовали auth scaffolding в 5.5, просто наведите свой href
на:
{{ route('logout') }}
Не нужно изменять маршруты или контроллеры.