Laravel中无法修改dingo/api内置api.auth中间件时该如何处理?
解决方案:在Dingo认证后设置用户相关配置
我来给你几个靠谱的解决方案,都是不用修改Dingo源码就能实现需求的:
方案一:自定义中间件,放在api.auth之后
既然api.auth中间件已经完成了用户认证,那我们只需要在它之后添加自己的中间件,就能安全获取到当前用户了,步骤如下:
- 创建自定义中间件
运行Artisan命令生成中间件:
php artisan make:middleware SetUserConfig
- 编写中间件逻辑
打开生成的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); } }
- 注册中间件
在app/Http/Kernel.php的$routeMiddleware数组里添加你的中间件:
protected $routeMiddleware = [ // 其他中间件... 'user.config' => \App\Http\Middleware\SetUserConfig::class, ];
- 更新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事件,我们可以通过监听这个事件来全局处理用户配置,适合所有认证路由都需要初始化配置的场景:
- 创建事件监听器
运行命令生成监听器:
php artisan make:listener SetUserConfigOnAuthentication
- 编写监听器逻辑
打开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'])]); // 或者其他业务初始化 } }
- 注册事件与监听器
在app/Providers/EventServiceProvider.php的$listen数组里添加绑定:
protected $listen = [ // 其他事件绑定... \Dingo\Api\Event\UserAuthenticated::class => [ \App\Listeners\SetUserConfigOnAuthentication::class, ], ];
这样只要用户通过Dingo的认证,这个监听器就会自动执行,不需要修改任何路由配置。
方案对比
- 如果只是特定路由组需要用户配置,优先选方案一,更灵活可控;
- 如果所有认证路由都需要初始化配置,方案二更省心,全局生效。
内容的提问来源于stack exchange,提问作者Amir
相关产品推荐
相关产品推荐

