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

Laravel 9如何让多用户类型共享路由?管理员需访问用户页面

解决方案

方案一:修改UserAccess中间件支持多角色校验

当前中间件仅支持单一角色匹配,无法同时允许多个角色访问。通过修改中间件让它支持多角色校验,就能避免重复定义路由:

  1. 更新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, '无访问权限');
}
  1. 调整路由配置
    给需要开放给普通用户和管理员的路由组,传递多角色参数:
// 普通用户路由组,现在管理员也可访问
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 14:35:20