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

如何将Laravel路由的auth:api中间件设置为可选?

实现Laravel路由可选API授权(登录返回用户信息,未登录不拦截)

方法一:自定义可选授权中间件(适合批量路由)

这是最通用的方案,能让整个路由组支持“可选授权”:

  1. 生成自定义中间件
php artisan make:middleware OptionalApiAuth
  1. 编辑生成的中间件文件(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);
    }
}
  1. 在app/Http/Kernel.php中注册中间件,找到$routeMiddleware数组添加一行:
'auth.api.optional' => \App\Http\Middleware\OptionalApiAuth::class,
  1. 替换原有路由的中间件:
    • 原强制登录的Contact路由改成可选授权:
    Route::namespace('Contact')->middleware(['auth.api.optional'])->group(function () {
        // 你的Contact相关路由
    });
    
    • 原无法获取用户的Product路由加上该中间件:
    Route::namespace('Product')->middleware(['auth.api.optional'])->group(function () {
        // 你的Product相关路由
    });
    
  2. 控制器内获取用户:
    之后在控制器里就能正常用$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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 16:03:13