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

Laravel 11 Sanctum多守卫认证问题:admin路由始终返回未授权

Laravel 11 + Sanctum 多守卫认证问题排查方案

1. 修正Sanctum守卫配置

你当前config/sanctum.php里的guard只设置了['web'],但自定义了admin和user守卫,Sanctum无法识别这些守卫,导致auth:admin认证失败。修改配置如下:

'guard' => ['web', 'admin', 'user'],

也可只保留需要的守卫,比如['admin', 'user']。

2. 给Admin模型添加Sanctum Trait

App\Models\Admin模型必须引入Laravel\Sanctum\HasApiTokens trait,否则无法生成和验证与Admin绑定的令牌:

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;

class Admin extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;

    // 其他模型代码...
}

3. 登录时指定admin守卫

Admin登录接口必须用admin守卫做认证,否则生成的会话/令牌会绑定到默认守卫(比如web),后续auth:admin无法识别:

public function login(Request $request)
{
    $credentials = $request->validate([
        'email' => 'required|email',
        'password' => 'required',
    ]);

    // 用admin守卫验证凭证
    if (!auth()->guard('admin')->attempt($credentials)) {
        return response()->json(['message' => '账号密码错误'], 401);
    }

    $admin = auth()->guard('admin')->user();
    return response()->json(['admin' => $admin]);
}

4. 调整路由中间件顺序

SPA会话认证需要先通过web中间件(处理会话Cookie和CSRF),再叠加auth:admin,路由建议这么写:

Route::middleware(['web', 'auth:admin'])->group(function () {
    Route::get('/profile', [AdminAuthController::class, 'getProfile']);
});

即使路由在api前缀下,也要确保包含web中间件,因为Cookie会话依赖它处理。

5. 统一Cookie域名配置

.env里的SESSION_DOMAIN和SANCTUM_STATEFUL_DOMAINS要匹配,端口不同时,把SESSION_DOMAIN改成.localhost(带点),让不同端口的localhost能共享Cookie:

SESSION_DOMAIN=.localhost
SANCTUM_STATEFUL_DOMAINS=localhost:5173,localhost:8000

把后端服务端口(比如8000)也加到SANCTUM_STATEFUL_DOMAINS里。

6. 手动调试认证状态

在getProfile里加调试代码,确认admin守卫能否获取到用户:

public function getProfile(Request $request)
{
    // 直接打印admin守卫的用户对象
    dd(auth()->guard('admin')->user());

    // 也可通过request对象检查
    if ($request->user('admin')) {
        return response()->json($request->user('admin'));
    } else {
        return response()->json(['message' => '未认证'], 401);
    }
}

如果输出为null,说明守卫与当前会话未关联,回到前面步骤排查。

7. 清除配置缓存

修改配置后必须清理缓存,否则Laravel会使用旧配置:

php artisan config:clear
php artisan cache:clear

内容的提问来源于stack exchange,提问作者Mr Arman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 19:18:15