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

Laravel 8 路由如何配置auth:sanctum或auth.basic.once二选一中间件

问题原因

Laravel 路由中分配多个中间件时,默认规则为全部中间件校验通过才会放行请求,因此你最初将两个认证中间件放在数组中的写法,会强制要求同时通过两种认证,和你的需求不符。你尝试的两种用|分隔的写法不符合 Laravel 路由中间件的语法规则,因此无法生效。

解决方案

有两种常用实现方案可以实现「任意一种认证通过即可访问」的需求:

方案1:使用 auth 中间件的多守卫特性(最简方案)

auth 中间件本身支持传入多个守卫参数,用逗号分隔,只要任意一个守卫认证通过即可放行,写法如下:

Route::group(['middleware' => ['auth:sanctum,basic']], function () {
   Route::get('/images', [ImageController::class, 'index']);
});

方案2:自定义组合认证中间件(灵活适配特殊认证逻辑)

如果你使用的 auth.basic.once 是独立的专用中间件、无法通过多守卫配置实现,可以手动自定义一个中间件处理逻辑:

  1. 新建中间件 app/Http/Middleware/OptionalAuth.php:
<?php
namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;

class OptionalAuth
{
    public function handle($request, Closure $next)
    {
        // 校验Sanctum认证
        if (Auth::guard('sanctum')->check()) {
            Auth::shouldUse('sanctum');
            return $next($request);
        }

        // 校验HTTP Basic Once认证
        if (Auth::onceBasic() === null) {
            return $next($request);
        }

        // 两种认证都未通过返回401
        abort(401, 'Unauthenticated');
    }
}
  1. 在 app/Http/Kernel.php 中注册中间件:
protected $routeMiddleware = [
    // 原有其他中间件
    'auth.optional' => \App\Http\Middleware\OptionalAuth::class,
];
  1. 路由中使用自定义中间件:
Route::group(['middleware' => ['auth.optional']], function () {
   Route::get('/images', [ImageController::class, 'index']);
});

内容的提问来源于stack exchange,提问作者Bình Nguyễn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 15:36:03