Laravel Sanctum中间件获取Auth::user()为null,如何实现仅管理员访问控制?
问题原因
Auth::user()返回null的核心原因是中间件执行顺序错误:你的自定义管理员校验中间件执行时机早于auth:sanctum中间件,Sanctum还未完成用户身份解析,自然无法获取登录用户信息。你手动解析cookie的实现逻辑存在严重安全风险:Cookie存储在客户端可被任意篡改,攻击者直接修改Cookie里的角色字段即可伪造管理员身份,必须废弃该方案。
正确实现步骤
1. 调整中间件执行顺序
Laravel中间件按注册顺序从上到下执行,必须保证auth:sanctum在你的自定义管理员中间件之前运行,先完成身份校验再做权限判断。
2. 生成自定义管理员中间件
执行Artisan命令生成中间件文件:
php artisan make:middleware AdminCheck
打开生成的app/Http/Middleware/AdminCheck.php,写入校验逻辑:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Symfony\Component\HttpFoundation\Response; class AdminCheck { public function handle(Request $request, Closure $next): Response { // 已通过auth:sanctum校验的请求一定存在登录用户,未登录用户会被auth:sanctum直接拦截返回401 if (Auth::user()->role !== 'admin') { return response()->json(['message' => '权限不足,仅管理员可访问'], 403); } return $next($request); } }
3. 注册中间件别名(可选)
打开app/Http/Kernel.php,在$middlewareAliases数组中添加中间件别名,方便路由调用:
protected $middlewareAliases = [ // 框架自带中间件保留不变 'admin' => \App\Http\Middleware\AdminCheck::class, ];
4. 路由中挂载中间件
在routes/api.php中给需要管理员权限的接口组挂载中间件,注意顺序:
// 必须先跑auth:sanctum身份校验,再跑admin权限校验 Route::middleware(['auth:sanctum', 'admin'])->group(function () { // 所有需要管理员权限的接口都放在该分组内 });
额外校验项(有状态Sanctum场景)
如果你用的是同域名前端Cookie鉴权的有状态Sanctum模式,还需要确认两点配置:
config/sanctum.php中的stateful配置项已正确添加你的前端域名- 前端请求头必须携带
Accept: application/json
内容的提问来源于stack exchange,提问作者Kapibara231
相关产品推荐
相关产品推荐

