Laravel 8.x 基于Fortify/Jetstream实现登出删除Cookies方案问询
你找到的这套自定义LogoutResponse的方案完全适配你的需求,是Laravel Fortify官方推荐的扩展登出逻辑的标准实现,相比重写登出路由、监听登出事件的方案,逻辑更内聚,后续维护成本更低。
具体调整实现
1. 修改LogoutResponse类逻辑
文件路径:app/Http/Responses/LogoutResponse.php
<?php namespace App\Http\Responses; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Laravel\Fortify\Contracts\LogoutResponse as LogoutResponseContract; use Symfony\Component\HttpFoundation\Response; class LogoutResponse implements LogoutResponseContract { /** * Create an HTTP response that represents the object. * * @param Request $request * * @return Response */ public function toResponse($request) { // 此处可添加其他自定义清理逻辑,比如清理关联缓存、记录登出日志等 $response = $request->wantsJson() ? new JsonResponse('', 204) : redirect('/'); // 替换为实际需要的重定向地址 // 批量挂载要删除的Cookie,可按需新增多条 return $response ->withCookie(\Cookie::forget('cookie_name_1')) ->withCookie(\Cookie::forget('cookie_name_2')) ->withCookie(\Cookie::forget('cookie_name_3')); } }
2. 注册自定义LogoutResponse到服务容器
保持绑定逻辑即可,文件路径:app/Providers/FortifyServiceProvider.php
public function boot() { $this->app->singleton( \Laravel\Fortify\Contracts\LogoutResponse::class, \App\Http\Responses\LogoutResponse::class ); }
常见问题说明
Cookie删除注意事项
\Cookie::forget()方法只会生成一个过期时间设为过去时间的Cookie实例,必须将该实例通过withCookie方法挂载到响应对象上返回给浏览器,才会触发浏览器删除对应Cookie,单独执行\Cookie::forget()不会生效。
浏览器关闭时清理HTTP Only Cookie的实现
通过JS监听浏览器关闭事件删除HTTP Only Cookie的方案不可行:HTTP Only标记的Cookie会被浏览器禁止前端JS读写,前端没有操作权限。
如果需要实现关闭浏览器即失效的Cookie,在后端首次设置该Cookie时,将过期时间参数设置为null即可,这类会话Cookie默认会在用户关闭浏览器时被自动清理。
内容的提问来源于stack exchange,提问作者SScotti
相关产品推荐
相关产品推荐

