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 是独立的专用中间件、无法通过多守卫配置实现,可以手动自定义一个中间件处理逻辑:
- 新建中间件
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'); } }
- 在
app/Http/Kernel.php中注册中间件:
protected $routeMiddleware = [ // 原有其他中间件 'auth.optional' => \App\Http\Middleware\OptionalAuth::class, ];
- 路由中使用自定义中间件:
Route::group(['middleware' => ['auth.optional']], function () { Route::get('/images', [ImageController::class, 'index']); });
内容的提问来源于stack exchange,提问作者Bình Nguyễn
相关产品推荐
相关产品推荐

