如何在Laravel Sanctum中实现可选身份验证?
Laravel Sanctum 实现游客、登录用户同时可访问的路由解决方案
问题本质
原有两种方案的缺陷:
- 未加
auth:sanctum中间件时,Laravel不会主动解析请求头中的API Token,就算携带合法Token也不会自动登录用户,所以Auth::check()始终返回false - 加了强制
auth:sanctum中间件时,未携带Token的请求会直接抛出401未授权错误,拦截游客访问
解决方案:自定义可选身份验证中间件
步骤1:生成中间件文件
执行Artisan命令:php artisan make:middleware OptionalSanctumAuth
步骤2:编写中间件逻辑
打开app/Http/Middleware/OptionalSanctumAuth.php,替换内容为:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; class OptionalSanctumAuth { public function handle(Request $request, Closure $next) { // 请求携带Authorization头时尝试用Sanctum验证用户 if ($request->hasHeader('Authorization')) { Auth::guard('sanctum')->user(); } // 无论验证是否成功都继续执行后续逻辑 return $next($request); } }
步骤3:注册中间件
打开app/Http/Kernel.php,在$middlewareAliases数组中添加自定义中间件的别名:
protected $middlewareAliases = [ // 其他原有中间件 'optional.sanctum' => \App\Http\Middleware\OptionalSanctumAuth::class, ];
步骤4:配置路由
在路由文件中使用刚才注册的optional.sanctum中间件:
Route::get('mixedauth', function () { return Auth::check(); })->middleware('optional.sanctum');
效果验证
- 携带合法API Token访问时,
Auth::check()返回true,可正常获取登录用户信息 - 未携带API Token或Token非法时,
Auth::check()返回false,游客可正常访问接口,不会返回401错误
内容的提问来源于stack exchange,提问作者Gergő Gutyina
相关产品推荐
相关产品推荐

