首页 文章

如何在Laravel 5.x中注销过期的会话?

提问于
浏览
7

更新版本的Laravel(正确)使用POST注销会话 . 这样做的原因是GET / HEAD只应用于被动操作以符合HTTP .

使用csrf令牌进行POST也可以防止恶意用户/站点将您从会话中注销:https://security.stackexchange.com/questions/62769/must-login-and-logout-action-have-csrf-protection

However 如果会话已超时,并且用户单击注销(触发POST到注销路由),则会收到令牌不匹配错误 . 这是有道理的 - 令牌不匹配,因为会话已过期 .

我可以根据请求变量捕获特定的TokenMismatchException,如果是的话,以他们的快乐方式继续它们(到登出的重定向路径,比如说“home”或“/”) . 像这样:

public function render($request, Exception $e)
{
    if ($e instanceof TokenMismatchException && $request->getRequestUri() === '/logout') {
        return redirect('/');
    }

    return parent::render($request, $e);
}

My question 是:如果我这样做,首先是令牌的重点是什么?以及如何在会话过期时注销用户,同时保持使用带有CSRF令牌的POST注销的预期结果?

1 回答

  • 3

    检查身份验证的中间件应该在检查CSRF令牌有效性的中间件之前运行 .

    这样,当会话到期时,您从未首先进行CSRF检查,因为您已经在身份验证中间件中检查了会话过期并完成了重定向到那里的登录页面 .

    这不会影响有效会话注销的CSRF保护,因为有效会话将通过身份验证中间件 .

    默认情况下,Laravel中间件首先运行CSRF检查 . 但是,应该很容易将它们重新排序以便以其他方式工作 .

相关问题