Laravel 5.6.20同URL不同用户组路由配置异常问题
嘿,我来帮你搞定这个问题!你现在遇到的核心问题是Laravel路由的匹配顺序规则——当你定义了两个完全相同的/路由时,框架会按照代码编写的顺序优先匹配第一个。举个例子:
- 如果普通用户访问
/,会先进入第一个Admin路由组的中间件,直接触发401异常,根本轮不到第二个User路由组执行; - 要是把User路由组放在前面,admin用户访问时又会被User中间件拦截,同样抛出未授权错误。
下面给你两种靠谱的实现方案,推荐第一种,更符合Laravel的最佳实践:
方案一:用统一中间件分发请求(最优雅)
我们可以新建一个中间件,专门负责根据用户角色把请求转发到对应控制器,这样只需要一个/路由就够了。
步骤1:创建角色分发中间件
先执行Artisan命令生成中间件:
php artisan make:middleware RouteByRole
步骤2:编写中间件逻辑
打开app/Http/Middleware/RouteByRole.php,替换成下面的代码:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use App\User; class RouteByRole { public function handle(Request $request, Closure $next) { $currentUser = auth()->user(); // 根据角色ID转发到对应控制器方法 if ($currentUser->role->id === User::ROLE_ADMIN) { return app()->call('App\Http\Controllers\AdminController@index'); } elseif ($currentUser->role->id === User::ROLE_USER) { return app()->call('App\Http\Controllers\CvController@index'); } // 处理其他未知角色的情况 abort(403, '无访问权限'); } }
步骤3:更新路由配置
把原来的两个路由组删掉,换成下面的代码,把新中间件加进去:
Route::group( [ 'middleware' => [ 'auth', \App\Http\Middleware\UserLastActivity::class, \App\Http\Middleware\RouteByRole::class // 新增的分发中间件 ], 'domain' => parse_url( env( 'APP_URL' ), PHP_URL_HOST ) ], function () { Route::get('/', function () {})->name('home'); });
这里的空闭包只是占个位置,实际请求会被中间件转发到对应控制器。
方案二:直接在路由闭包里处理(快速实现)
如果不想新增中间件,也可以直接在路由的闭包内判断角色,分发请求:
Route::group( [ 'middleware' => [ 'auth', \App\Http\Middleware\UserLastActivity::class ], 'domain' => parse_url( env( 'APP_URL' ), PHP_URL_HOST ) ], function () { Route::get('/', function () { $currentUser = auth()->user(); if ($currentUser->role->id === \App\User::ROLE_ADMIN) { return app()->call('App\Http\Controllers\AdminController@index'); } elseif ($currentUser->role->id === \App\User::ROLE_USER) { return app()->call('App\Http\Controllers\CvController@index'); } abort(403, '无访问权限'); })->name('home'); });
两种方案都能完美实现你的需求:admin用户访问/时执行AdminController@index,普通用户访问时执行CvController@index。个人更推荐方案一,因为把角色分发的逻辑集中在中间件里,后续维护和扩展都更方便。
内容的提问来源于stack exchange,提问作者user936965
相关产品推荐
相关产品推荐

