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
相关产品推荐
相关产品推荐

