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

Laravel 8 路由角色关联语法问题求助

Laravel 8 路由绑定角色权限的解决办法

1. 修正路由写法

Laravel 8虽然调整了控制器的引用方式,但依然支持给路由添加自定义的roles属性,只需在路由的数组配置里补充即可,同时别忘了添加auth和对应的权限中间件:

// 单个路由绑定角色
Route::prefix('customers')->middleware(['auth', 'roles'])->group(function () {
    Route::get('/employ', [
        App\Http\Controllers\CustomerController::class, 
        'getList',
        'roles' => ['customers','admin']
    ]);
    Route::get('/add', [
        App\Http\Controllers\CustomerController::class, 
        'getAdd',
        'roles' => ['customers','admin']
    ]);
});

如果想给整个路由组统一设置角色,也可以直接在组的配置里添加:

// 路由组统一绑定角色
Route::group([
    'prefix' => 'customers',
    'middleware' => ['auth', 'roles'],
    'roles' => ['customers','admin']
], function () {
    Route::get('/employ', [App\Http\Controllers\CustomerController::class, 'getList']);
    Route::get('/add', [App\Http\Controllers\CustomerController::class, 'getAdd']);
});

2. 中间件无需大改(可选优化)

你当前的CheckRole中间件逻辑完全可用,不过可以简化空值判断的写法,让代码更清爽:

<?php

namespace App\Http\Middleware;

use Closure;

class CheckRole
{
    public function handle($request, Closure $next)
    {   
        if (!$request->user()) {
            return response()->view('errors.401');
        }

        // 直接用getAction方法的参数获取roles,不存在则返回null
        $roles = $request->route()->getAction('roles');

        if (!$roles || $request->user()->hasAnyRole($roles)) {
           return $next($request);
        }

        return response()->view('errors.401');
    }
}

3. 确认中间件别名注册

最后要确保app/Http/Kernel.php里已经把CheckRole中间件注册成roles别名,否则路由里的middleware调用会失效:

protected $routeMiddleware = [
    // ...其他已有中间件
    'roles' => \App\Http\Middleware\CheckRole::class,
];

这样配置完成后,就能和旧版本一样,通过路由上的roles属性控制用户的访问权限了。

内容的提问来源于stack exchange,提问作者jsilmarovi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 12:10:27