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

