更新版本的Laravel(正确)使用POST注销会话。这样做的原因是GET / HEAD只应用于被动操作以符合HTTP。
使用csrf令牌进行发布还可以防止恶意用户/站点将您从会话中注销:https://security.stackexchange.com/questions/62769/must-login-and-logout-action-have-csrf-protection
但是,如果会话已超时,并且用户单击注销(触发POST到注销路由),则会收到令牌不匹配错误。这是有道理的 - 令牌不匹配,因为会话已过期。
我可以根据请求变量捕获特定的TokenMismatchException,如果是的话,以他们的快乐方式继续它们(到登出的重定向路径,比如说“home”或“/”)。像这样:
public function render($request, Exception $e)
{
if ($e instanceof TokenMismatchException && $request->getRequestUri() === '/logout') {
return redirect('/');
}
return parent::render($request, $e);
}
我的问题是:如果我这样做,首先是令牌的重点是什么?以及如何在会话过期时注销用户,同时保持使用带有CSRF令牌的POST注销的预期结果?
对于Laravel 5.7,请参阅下面的更新
检查身份验证的中间件应该在检查CSRF令牌有效性的中间件之前运行。
这样,当会话到期时,您从未首先进行CSRF检查,因为您已经在身份验证中间件中检查了会话过期并完成了重定向到那里的登录页面。
这不会影响有效会话注销的CSRF保护,因为有效会话将通过身份验证中间件。
默认情况下,Laravel中间件首先运行CSRF检查。但是,应该很容易将它们重新排序以便以其他方式工作。
对于Laravel 5.7:
在Laravel 5.7中,Illuminate\Foundation\Http\Kernel
类有一个新领域:
/**
* The priority-sorted list of middleware.
*
* This forces non-global middleware to always be in the given order.
*
* @var array
*/
protected $middlewarePriority = [
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\Illuminate\Auth\Middleware\Authenticate::class,
\Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\Illuminate\Auth\Middleware\Authorize::class,
];
出现在此字段中的中间件类始终按其出现的顺序运行。此字段的默认设置如上所示。 (Laravel入门项目只对该列表进行了一处更改:\App\Http\Middleware\Authenticate::class
而不是\Illuminate\Auth\Middleware\Authenticate::class
。)
如果将CSRF中间件添加到列表中(身份验证中间件下方的任何位置),则应确保它始终按所需顺序运行。