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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 15:57:00