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

Laravel中无法修改dingo/api内置api.auth中间件时该如何处理?

解决方案:在Dingo认证后设置用户相关配置

我来给你几个靠谱的解决方案,都是不用修改Dingo源码就能实现需求的:

方案一:自定义中间件,放在api.auth之后

既然api.auth中间件已经完成了用户认证,那我们只需要在它之后添加自己的中间件,就能安全获取到当前用户了,步骤如下:

  1. 创建自定义中间件
    运行Artisan命令生成中间件:
php artisan make:middleware SetUserConfig
  1. 编写中间件逻辑
    打开生成的app/Http/Middleware/SetUserConfig.php,在handle方法里添加你的配置逻辑:
<?php

namespace App\Http\Middleware;

use Closure;

class SetUserConfig
{
    public function handle($request, Closure $next)
    {
        // 此时Dingo已经完成认证,可以正常获取用户
        $user = app('Dingo\Api\Auth\Auth')->user();
        
        // 在这里设置用户相关配置,比如
        config(['current_user.id' => $user->id]);
        // 或者执行其他和用户绑定的初始化操作
        
        return $next($request);
    }
}
  1. 注册中间件
    在app/Http/Kernel.php的$routeMiddleware数组里添加你的中间件:
protected $routeMiddleware = [
    // 其他中间件...
    'user.config' => \App\Http\Middleware\SetUserConfig::class,
];
  1. 更新Dingo路由
    把自定义中间件加到api.auth后面,确保它在认证完成后执行:
<?php
$api = app('Dingo\Api\Routing\Router');
$api->version('v1', ['prefix' => 'v1', 'namespace' => 'App\Http\Controllers'], function ($api) {
    $api->group(['prefix' => 'admin', 'middleware' => ['api.auth', 'user.config']], function ($api) {
        $api->get('checkRole/{branch_id}', 'RoleController@getRoles');
        // 其他需要用户配置的路由...
    });
});

方案二:监听Dingo的认证事件

Dingo在完成用户认证后会触发UserAuthenticated事件,我们可以通过监听这个事件来全局处理用户配置,适合所有认证路由都需要初始化配置的场景:

  1. 创建事件监听器
    运行命令生成监听器:
php artisan make:listener SetUserConfigOnAuthentication
  1. 编写监听器逻辑
    打开app/Listeners/SetUserConfigOnAuthentication.php,在handle方法里处理:
<?php

namespace App\Listeners;

use Dingo\Api\Event\UserAuthenticated;

class SetUserConfigOnAuthentication
{
    public function handle(UserAuthenticated $event)
    {
        // 事件对象里直接包含认证后的用户
        $user = $event->user;
        
        // 执行你的配置操作
        config(['current_user' => $user->only(['id', 'name', 'branch_id'])]);
        // 或者其他业务初始化
    }
}
  1. 注册事件与监听器
    在app/Providers/EventServiceProvider.php的$listen数组里添加绑定:
protected $listen = [
    // 其他事件绑定...
    \Dingo\Api\Event\UserAuthenticated::class => [
        \App\Listeners\SetUserConfigOnAuthentication::class,
    ],
];

这样只要用户通过Dingo的认证,这个监听器就会自动执行,不需要修改任何路由配置。

方案对比

  • 如果只是特定路由组需要用户配置,优先选方案一,更灵活可控;
  • 如果所有认证路由都需要初始化配置,方案二更省心,全局生效。

内容的提问来源于stack exchange,提问作者Amir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:50:25