Laravel 8使用Sanctum做身份校验时Auth::check()是否可以正常生效?
问题解答
1. Laravel的auth()方法完全可以和Sanctum配合使用
你现在遇到Auth::check()不生效的核心原因有两个:
- 配置错误:你
config/auth.php中的apiguard还是用的旧版token驱动,没有替换为Sanctum驱动,导致Sanctum的身份校验逻辑没有被触发。 - 场景逻辑错误:Blade模板的渲染是在服务端返回页面前完成的,如果你是跨域前后端分离项目,首次请求页面时前端还未携带存储在本地的Sanctum令牌,服务端自然无法识别身份,
Auth::check()必然返回false。
另外你LoginController的代码存在冗余:auth()->attempt()验证通过后已经自动完成了密码校验,不需要再单独写Hash::check逻辑。
2. 判断Sanctum是否正常生效的方法
第一步先修正基础配置
先把config/auth.php中的api guard驱动改为Sanctum:
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], // 替换原有api guard配置 'api' => [ 'driver' => 'sanctum', 'provider' => 'users', 'hash' => false, ], // 其余非系统默认的guard如果不需要可以直接删除,避免干扰 ],
代码校验方法
- 路由测试法:添加测试路由,携带令牌请求后即可判断是否生效
// routes/api.php Route::get('/sanctum-test', function () { return [ 'sanctum_status' => auth('sanctum')->check() ? '正常' : '异常', 'current_user' => auth('sanctum')->user() ]; })->middleware('auth:sanctum');
请求时在Header中添加Authorization: Bearer 你登录后拿到的明文令牌,如果返回正常状态即为Sanctum运行正常。
- 直接校验令牌法:可以直接通过Sanctum的模型验证令牌有效性
use Laravel\Sanctum\PersonalAccessToken; // 传入去掉Bearer前缀的明文令牌 $accessToken = PersonalAccessToken::findToken('your_plain_text_token'); if ($accessToken && !$accessToken->expires_at?->isPast()) { // Sanctum功能正常,令牌有效 $user = $accessToken->tokenable; }
场景适配建议
- 如果是同域名SPA:使用Sanctum的会话认证模式即可,登录请求走
web路由组,auth()->attempt()验证通过后会自动生成session cookie,前端axios开启withCredentials: true,此时Blade中的Auth::check()可以正常读取session返回正确状态。 - 如果是跨域前后端分离项目:不要在Blade中判断登录状态,改为前端登录后将登录状态存在本地存储/pinia/vuex中自行维护即可。
内容的提问来源于stack exchange,提问作者user759235
相关产品推荐
相关产品推荐

