Laravel路由权限控制:管理员全访问,协作者仅可编辑自身信息
解决方案
你之前尝试在路由参数里直接写{auth()->id}是无效的——路由参数仅支持占位符,不能直接嵌入PHP函数调用。下面提供两种可行的实现方式:
方法一:控制器内直接做权限校验
保留原有的管理员路由组,同时为协作者单独注册edit和update路由,然后在控制器方法内添加权限判断逻辑:
路由配置
// 管理员专属路由(保留原有配置) Route::middleware(['admin']) ->prefix('users') ->name('users.') ->group(function() { Route::get('management/list', '\App\Http\Controllers\UserController@list'); Route::resource('management', '\App\Http\Controllers\UserController'); }); // 协作者专属路由(仅允许编辑自身账号) Route::middleware(['auth']) ->prefix('users') ->name('users.') ->group(function() { Route::get('management/{user}/edit', '\App\Http\Controllers\UserController@edit'); Route::put('management/{user}', '\App\Http\Controllers\UserController@update'); });
控制器逻辑修改
在UserController的edit和update方法中加入校验:
public function edit(User $user) { // 非管理员只能编辑自己的账号 if (!auth()->user()->isAdmin() && $user->id !== auth()->id()) { abort(403, '无权限访问该页面'); } // 原有业务逻辑... } public function update(Request $request, User $user) { if (!auth()->user()->isAdmin() && $user->id !== auth()->id()) { abort(403, '无权限修改该账号'); } // 原有业务逻辑... }
注:这里假设你有isAdmin()方法判断用户身份,可根据实际情况替换为角色字段检查(比如auth()->user()->role === 'admin')。
方法二:自定义权限中间件(推荐)
把权限校验逻辑抽离到中间件中,实现关注点分离,更符合Laravel的设计原则:
1. 生成中间件
执行命令创建新中间件:
php artisan make:middleware CollaboratorCanEditSelf
2. 编写中间件逻辑
在app/Http/Middleware/CollaboratorCanEditSelf.php中修改handle方法:
public function handle(Request $request, Closure $next) { $targetUser = $request->route('user'); // 对应路由中的{user}占位符 $currentUser = auth()->user(); // 管理员直接放行,非管理员仅能操作自身账号 if (!$currentUser->isAdmin() && $targetUser->id !== $currentUser->id) { abort(403, '无权限访问'); } return $next($request); }
3. 注册中间件
在app/Http/Kernel.php的$routeMiddleware数组中添加:
'collaborator.self' => \App\Http\Middleware\CollaboratorCanEditSelf::class,
4. 配置路由
// 管理员路由组不变 Route::middleware(['admin']) ->prefix('users') ->name('users.') ->group(function() { Route::get('management/list', '\App\Http\Controllers\UserController@list'); Route::resource('management', '\App\Http\Controllers\UserController'); }); // 协作者路由组,应用自定义中间件 Route::middleware(['auth', 'collaborator.self']) ->prefix('users') ->name('users.') ->group(function() { Route::get('management/{user}/edit', '\App\Http\Controllers\UserController@edit'); Route::put('management/{user}', '\App\Http\Controllers\UserController@update'); });
两种方法都能实现需求:管理员可编辑所有用户,协作者仅能编辑自身账号。方法一更适合快速实现,方法二更适合权限逻辑复杂的场景。
内容的提问来源于stack exchange,提问作者alexandre9865
相关产品推荐
相关产品推荐

