Laravel 8 路由配置多scope权限中间件访问不生效问题求解
问题原因
- 最常见的原因是中间件别名注册错误:Laravel Passport提供两个scope校验中间件,你大概率将需要同时匹配所有scope的
CheckScopes中间件注册成了scope别名,导致逗号分隔的多个scope要求用户必须同时持有所有权限才能访问,自然只有单个manage-all-clicks-creatives权限的用户会被拦截。
两个中间件的默认作用如下:CheckForAnyScope:只要请求token持有列出的任意一个scope即可放行,对应官方文档里的scope中间件CheckScopes:请求token必须同时持有列出的所有scope才可放行,对应别名scopes
- 另外你尝试的后两种配置写法本身不符合官方规范,不可能生效:
- 竖线分隔不会被中间件识别为多scope,会被整体当做一个scope字符串匹配
- 数组形式声明两次
scope中间件,相当于连续执行两次校验,要求用户同时持有两个权限才能通过
解决方案
- 先校验
bootstrap/app.php中的中间件别名注册是否正确,确保scope别名对应CheckForAnyScope类:
$app->routeMiddleware([ 'auth' => App\Http\Middleware\Authenticate::class, // 任意匹配一个scope就放行的中间件 'scope' => \Laravel\Passport\Http\Middleware\CheckForAnyScope::class, // 必须匹配所有scope才放行的中间件 'scopes' => \Laravel\Passport\Http\Middleware\CheckScopes::class, ]);
- 路由直接使用逗号分隔多scope的写法即可,完全符合官方规范:
$router->group(['middleware' => 'scope:manage-clicks-creatives,manage-all-clicks-creatives'], function () use ($router) { $router->post('creatives', 'CreativeController@store'); });
- 如果你使用的是自定义的
AuthorizeScope中间件,直接修改第23行附近的校验逻辑,将「需要匹配所有scope」的判断改为「匹配到任意一个scope就放行」即可。
内容的提问来源于stack exchange,提问作者commadelimited
相关产品推荐
相关产品推荐

