You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 8使用Sanctum做身份校验时Auth::check()是否可以正常生效?

问题解答

1. Laravel的auth()方法完全可以和Sanctum配合使用

你现在遇到Auth::check()不生效的核心原因有两个:

  1. 配置错误:你config/auth.php中的api guard还是用的旧版token驱动,没有替换为Sanctum驱动,导致Sanctum的身份校验逻辑没有被触发。
  2. 场景逻辑错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 16:48:02