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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 17:54:03