Я запускаю команду php ремесленник сделать: авторизация и шаг за шагом объясню, что я делаю после этого, чтобы понять сценарий,
Дело в том, что могут возникать такие сценарии, и я не хочу видеть это сообщение об ошибке, просто выйдите из системы после нажатия кнопки «Выйти», даже если срок действия сеанса истек.
Примечание. Эта проблема возникает не из-за того, что @csrf не добавлен.






Что ж, это очевидное сообщение, которое вы, возможно, можете попытаться улучшить для этой страницы, но все же хорошо показать его, чтобы пользователь знал, что произошло. Если вы хотите сделать это по-другому, вы можете попробовать перенаправить на страницу входа.
Итак, в вашем файле app\Exceptions\Handler.php в методе рендеринга добавьте следующее:
if ($exception instanceof \Illuminate\Session\TokenMismatchException) {
return redirect()->route('login');
}
Затем перенаправьте на другую страницу, у вас, вероятно, есть одна общая для администраторов и пользователей, которая будет перенаправлять на ту страницу входа, на которую необходимо перенаправить вас.
Да, я получил свое решение, проверю текущий URL-адрес и перенаправлю соответственно. Спасибо за помощь, брат.
ИМХО, вы можете попробовать изменить свой файл app/Http/Middleware/VerifyCsrfToken.php.
Отредактируйте свойство $кроме примерно так:
class VerifyCsrfToken extends Middleware
{
protected $except = [
'http://example.com/logout',
];
Привет, спасибо за ответ.
Это полностью отключает защиту csrf для этого маршрута.
очень плохое и небезопасное решение.
Это не решение, а всего лишь недостаток безопасности.
<a href = "{{ route('logout') }}" class = "dropdown-item notify-item" = "event.preventDefault(); document.getElementById('logout-form').submit();">
<i class = "fa fa-power-off"></i> <span>{{ __('Logout') }} </span>
</a>
<form id = "logout-form" action = "{{ route('logout') }}" method = "POST" style = "display: none;">
@csrf
</form>
Вы пропустили @csrf в форме выхода, поэтому только вы получаете ошибку 419.
Извините, приятель, проблема не в этом, я уже упоминал об этом в своем вопросе.
В проекте Laravel 6 я изменил VerifyCsrfTokenMiddleware следующим образом:
Как вы увидите, я просто добавил именованный маршрут logout в список исключений.
Я переопределил функцию __construct, потому что мы не можем использовать функцию route() при инициализации новой переменной.
<?php
namespace App\Http\Middleware;
use Illuminate\Contracts\Encryption\Encrypter;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
class VerifyCsrfToken extends Middleware
{
/**
* Indicates whether the XSRF-TOKEN cookie should be set on the response.
*
* @var bool
*/
protected $addHttpCookie = true;
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
];
/**
* Create a new middleware instance.
*
* @param \Illuminate\Contracts\Foundation\Application $app
* @param \Illuminate\Contracts\Encryption\Encrypter $encrypter
* @return void
*/
public function __construct(Application $app, Encrypter $encrypter)
{
parent::__construct($app, $encrypter);
$this->except = [
route('logout')
];
}
}
Полное удаление токена csrf для выхода из системы является недостатком безопасности и не рекомендуется. Принудительный выход пользователей из системы с помощью атаки csrf может привести к тому, что они раскроют учетные данные для входа в систему, пока они находятся под наблюдением.
Не могли бы вы указать мне документацию по этой проблеме? и что ты предлагаешь? У меня не может быть жалоб пользователей, потому что они не могут выйти из системы из-за истечения срока действия токена csrf.
один пример security.stackexchange.com/questions/62769/…
Я предложил решение в качестве ответа на этот пост. Добавляйте маршрут выхода из системы в правила исключений только в том случае, если срок действия сеанса пользователя уже истек.
Решение проблемы относительно простое и требует небольшого дополнения к ПО промежуточного слоя VerifyCsrfToken;
use Closure;
public function handle($request, Closure $next)
{
if (!Auth::check() && $request->route()->named('logout')) {
$this->except[] = route('logout');
}
return parent::handle($request, $next);
}
Обычно этот файл содержит только массив маршрутов $except, которые следует игнорировать из csrf.
В этом коде мы переопределяем метод handle и выполняем две проверки.
Если оба верны, мы добавляем «выход из системы» в массив исключений. Затем мы передаем управление ядру VerifyCsrfMiddleware, которое распознает наличие маршрута выхода в массиве и обходит проверку. Данные формы размещены правильно, и мы перенаправлены с помощью LogoutResponse.
Пользователь не видит страницы с ошибкой.
Проверяя таким образом, мы гарантируем, что подлинные запросы на выход по-прежнему защищены токеном CSRF.
Ниже use Closer; добавьте use Auth; Для новичков, в проекте Laravel 7 он находится в /app/Http/Middleware/VerifyCsrfToken.php. Ниже приведен полный файл VerifyCsrfToken.php. <?php namespace App\Http\Middleware; use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware; use Closure; use Auth; class VerifyCsrfToken extends Middleware { /** * The URIs that should be excluded from CSRF verification. * * @var array */ protected $except = [ // ]; }
У SO есть некоторые странные правила: «Комментарии можно редактировать только в течение 5 минут». Таким образом, в приведенном выше есть некоторые недостающие детали. Ну что ж.
да. Подходит для Laravel 7 и 8.
Вам нужно добавить токен CSRF в форму:
<form action = "{{ route('logout') }}" method = "POST">
@csrf
<button type = "submit" class = "btn nav-link">Logout</button>
</form>
Прочтите примечание к вопросу. Примечание. Эта проблема не связана с тем, что @csrf не добавлен.
Никогда не поздно)
Добавить приложение/Http/Middleware/VerifyCsrfToken.php
use Closure;
public function handle($request, Closure $next)
{
if ($request->route()->named('logout')) {
if (auth()->check()) {
auth()->logout();
}
return redirect('/');
}
return parent::handle($request, $next);
}
Я думаю, что это лучшие решения.
Привет, это работает, Танск! Но когда я пытаюсь использовать мультиаутентификацию, сценарий 419 страница не найдена в сеансе администратора, перенаправляющий мой URL-адрес входа администратора на этот (redirect()->route('login')) (т.е. на логин пользователя)