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

Laravel Sanctum Token与Session权限验证异常问题咨询

Laravel Sanctum 强制Token认证解决Session绕过问题

你遇到的是Sanctum的默认行为:auth:sanctum中间件会优先检查Token,若Token不存在,会自动回退到Session认证。要实现仅允许Token认证访问,可以通过自定义中间件来限制:

步骤1:创建自定义中间件

执行命令生成中间件:

php artisan make:middleware EnsureTokenIsValid

打开生成的app/Http/Middleware/EnsureTokenIsValid.php,替换内容为:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class EnsureTokenIsValid
{
    public function handle(Request $request, Closure $next): Response
    {
        // 验证当前用户是否通过Sanctum Token认证
        if (!$request->user() || !$request->user()->currentAccessToken()) {
            return response()->json(['message' => 'Unauthorized'], Response::HTTP_UNAUTHORIZED);
        }

        return $next($request);
    }
}

步骤2:注册中间件

打开app/Http/Kernel.php,在$routeMiddleware数组中添加自定义中间件:

protected $routeMiddleware = [
    // ... 其他中间件
    'auth.sanctum.token' => \App\Http\Middleware\EnsureTokenIsValid::class,
];

步骤3:路由使用自定义中间件

将原来的auth:sanctum替换为自定义中间件,确保只有Token认证的请求能进入路由组:

Route::middleware('auth.sanctum.token')->group(function () {
    // 你的API路由定义
});

关于Token用户的数据存储

要为每个Token用户保存数据,可以通过当前Token关联存储:

// 获取当前请求的Token实例
$token = $request->user()->currentAccessToken();

// 示例:将数据存在Token的关联模型或缓存中
// 比如缓存键用Token的id
cache()->put("token_data_{$token->id}", $yourData, now()->addMinutes(60));

这样就能彻底避免Session绕过Token认证的情况,确保只有携带有效Token的请求才能访问目标路由。

内容的提问来源于stack exchange,提问作者Andrea Verrecchia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 05:39:52