Laravel 8 Sanctum tokenCan验证失效问题求助
嘿,我来帮你梳理这个问题的可能原因,结合你的代码和描述,大概率是这几个点中的一个:
1. 代码逻辑错误:检查了错误用户的权限
你在代码里通过User::find($request->user_id)获取用户,但实际上,当auth:sanctum中间件完成认证后,当前请求的认证用户应该直接用$request->user()来获取,而不是从请求参数里取user_id去查询。
如果request->user_id对应的用户和当前拿着token认证的用户不是同一个人,那你检查的是另一个用户的权限,自然会返回false。正确的写法应该是:
$user = $request->user(); // 直接获取当前认证的用户
2. 数据库中token的abilities字段格式不对
Laravel Sanctum的personal_access_tokens表中,abilities字段要求存储JSON数组格式,比如["user:addkeys"]。如果你手动在数据库里添加的是纯字符串"user:addkeys"而不是数组,那tokenCan()方法根本识别不了这个权限。
你可以去数据库里查一下对应的token记录,确认abilities字段的值是不是正确的JSON数组。如果格式错了,改成数组格式就行。
3. 调用接口用的token不是带user:addkeys权限的那个
虽然你说数据库里存在带该权限的token,但你在Postman里调用接口时,真的携带了这个正确的token吗?
你可以核对Postman里的Authorization头(格式是Bearer {你的明文token}),然后去数据库的personal_access_tokens表中,对比该token对应的abilities字段是否包含user:addkeys(注意数据库里的token字段是哈希后的,你可以通过name或者创建时间来找到对应的记录)。
4. Laravel缓存导致权限未更新
有时候Laravel的缓存会影响权限的读取,你可以尝试清除缓存来排除这个问题:
php artisan cache:clear php artisan config:clear php artisan route:clear
按照这几个步骤排查,应该就能找到问题所在啦!
内容的提问来源于stack exchange,提问作者Ruud van de Ven

