Laravel 9如何让多用户类型共享路由?管理员需访问用户页面
解决方案
方案一:修改UserAccess中间件支持多角色校验
当前中间件仅支持单一角色匹配,无法同时允许多个角色访问。通过修改中间件让它支持多角色校验,就能避免重复定义路由:
- 更新
Http/Middleware/UserAccess.php的handle方法
将单一参数判断改为支持逗号分隔的多角色列表:
public function handle(Request $request, Closure $next, $userTypes) { // 拆分逗号分隔的角色字符串为数组 $allowedTypes = explode(',', $userTypes); // 校验用户类型是否在允许范围内 if (in_array(auth()->user()->type, $allowedTypes)) { return $next($request); } // 权限不足时返回403或自定义视图 return abort(403, '无访问权限'); }
- 调整路由配置
给需要开放给普通用户和管理员的路由组,传递多角色参数:
// 普通用户路由组,现在管理员也可访问 Route::middleware(['auth', 'user-access:usr,adm'])->group(function () { Route::get('/', function () { return view('pages.activityHome'); }); }); // 管理员专属路由组保持不变 Route::middleware(['auth', 'user-access:adm'])->group(function () { Route::get('activity/{id}/edit', [App\Http\Controllers\activityController::class, 'editActivity'])->name('edit.activity'); });
方案二:基于角色层级自动授权
如果管理员天然拥有普通用户的所有权限,可以直接在中间件中增加层级判断,无需修改路由:
修改UserAccess.php:
public function handle(Request $request, Closure $next, $userType) { $currentUserType = auth()->user()->type; // 管理员直接通过所有权限校验 if ($currentUserType === 'adm') { return $next($request); } // 普通用户仅匹配对应角色 if ($currentUserType === $userType) { return $next($request); } return abort(403); }
这种方式下,管理员自动能访问所有需要usr权限的页面,普通用户依然无法进入管理员专属路由,无需改动现有路由结构。
内容的提问来源于stack exchange,提问作者redystum
相关产品推荐
相关产品推荐

