默认情况下,Laravel 在每个请求上都会设置一个名为 [APP_NAME]_session 的 Cookie。它用于以下功能redirect()->back()
.
这个 cookie 会阻止我的缓存机制正常工作(FastCGI、Varnish,凡是你能想到的)
如果我百分百确定我不需要它,有没有办法在用户未经身份验证时删除此 cookie,而不阻止他们照常登录?
我想在用户经过身份验证时显示不同的菜单,因此我无法在某些路由上应用不同的中间件。
我创建了一个新类,它扩展了 StartSession 中间件(在app/Middleware/Kernel.php
, 在 - 的里面web
group).
<?php
namespace App\Http\Middleware;
use Illuminate\Contracts\Session\Session;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cookie;
use Symfony\Component\HttpFoundation\Response;
class StartSession extends \Illuminate\Session\Middleware\StartSession
{
/**
* Start the session for the given request.
*
* @param Request $request
* @param Session $session
* @return Session
*/
protected function startSession(Request $request, $session): Session
{
return tap($session, function ($session) use ($request) {
$session->setRequestOnHandler($request);
if (Cookie::get(config("session.cookie"))) {
$session->start();
}
});
}
/**
* Add the session cookie to the application response.
*
* @param Response $response
* @param Session $session
* @return void
*/
protected function addCookieToResponse(Response $response, Session $session)
{
if (!auth()->check()) {
return;
}
if ($this->sessionIsPersistent($config = $this->manager->getSessionConfig())) {
$response->headers->setCookie(new \Symfony\Component\HttpFoundation\Cookie(
$session->getName(), $session->getId(), $this->getCookieExpirationDate(),
$config['path'], $config['domain'], $config['secure'] ?? false,
$config['http_only'] ?? true, false, $config['same_site'] ?? null
));
}
}
}
两个重要的部分是:
if (Cookie::get(config("session.cookie"))) {
$session->start();
}
此部分可防止在用户尚未经过身份验证时创建会话。
- 在 addCookieToResponse() 中:
if (!auth()->check()) {
return;
}
只要用户未经过身份验证,这部分就会阻止 Laravel 设置 cookie。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)