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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 19:48:25