如何将Laravel路由的auth:api中间件设置为可选?
实现Laravel路由可选API授权(登录返回用户信息,未登录不拦截)
方法一:自定义可选授权中间件(适合批量路由)
这是最通用的方案,能让整个路由组支持“可选授权”:
- 生成自定义中间件
php artisan make:middleware OptionalApiAuth
- 编辑生成的中间件文件(
app/Http/Middleware/OptionalApiAuth.php),替换为以下代码:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Auth\AuthenticationException; use Illuminate\Contracts\Auth\Factory as Auth; class OptionalApiAuth { protected $auth; public function __construct(Auth $auth) { $this->auth = $auth; } public function handle($request, Closure $next) { try { // 尝试用API guard验证用户,成功则自动设置登录态 $this->auth->guard('api')->authenticate(); } catch (AuthenticationException $e) { // 验证失败不拦截请求,直接放行 } return $next($request); } }
- 在
app/Http/Kernel.php中注册中间件,找到$routeMiddleware数组添加一行:
'auth.api.optional' => \App\Http\Middleware\OptionalApiAuth::class,
- 替换原有路由的中间件:
- 原强制登录的Contact路由改成可选授权:
Route::namespace('Contact')->middleware(['auth.api.optional'])->group(function () { // 你的Contact相关路由 });- 原无法获取用户的Product路由加上该中间件:
Route::namespace('Product')->middleware(['auth.api.optional'])->group(function () { // 你的Product相关路由 }); - 控制器内获取用户:
之后在控制器里就能正常用$request->user('api')或auth()->guard('api')->user()获取用户,有有效令牌就返回用户对象,无令牌则返回null,不会抛出授权错误。
方法二:控制器内手动验证(适合单个/少数方法)
如果不想新增中间件,也可以在控制器方法里直接处理:
public function getProducts(Request $request) { // 手动尝试获取登录用户 $user = $request->user('api'); // 基础响应数据 $response = [ 'list' => \App\Models\Product::paginate(10) ]; // 若用户已登录,追加用户信息 if ($user) { $response['user_info'] = $user->only('id', 'name', 'email'); } return response()->json($response); }
内容的提问来源于stack exchange,提问作者tcgkn
相关产品推荐
相关产品推荐

