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
相关产品推荐
相关产品推荐

