Laravel8未配置Sanctum中间件时如何通过Bearer Token获取用户ID
解决方案
方案1:手动调用Sanctum guard验证(推荐)
不需要给路由加auth:sanctum中间件,直接在业务逻辑里手动判断用户登录状态即可,Sanctum guard会自动识别请求头中的Token,有有效Token则返回对应用户,无Token则返回null,不会触发未登录拦截:
$is_fav = false; // 手动调用sanctum guard获取用户 $user = \Auth::guard('sanctum')->user(); // 只有登录用户才判断收藏状态 if ($user) { $is_fav = UserFav::where('user_id', $user->id) ->where('project_id', $id) ->exists(); }
方案2:手动解析Bearer Token获取用户
如果你需要自行解析Token处理逻辑,可以直接操作Sanctum的Token表查询:
use Laravel\Sanctum\PersonalAccessToken; $is_fav = false; // 获取请求中的Bearer Token $bearer = $request->bearerToken(); if ($bearer) { // 查询Token记录 $token = PersonalAccessToken::findToken($bearer); // 验证Token有效性、关联用户存在性、是否过期 if ($token && $token->tokenable && !$token->expires_at?->isPast()) { $user = $token->tokenable; $is_fav = UserFav::where('user_id', $user->id) ->where('project_id', $id) ->exists(); } }
优化提示
- 原代码中
get()->isEmpty()的写法可以替换为exists(),后者仅做存在性查询,SQL性能更高 - 不要直接依赖
request()->user(),默认情况下它只会读取默认guard的用户,未指定sanctum guard时就会返回null
内容的提问来源于stack exchange,提问作者Mokhtar Ghaleb
相关产品推荐
相关产品推荐

