【发布时间】:2018-10-20 01:19:24
【问题描述】:
我目前有两个路线组,其中一个路线组有六条路线,另一个有两条路线(也在前一组中)。
/**
* Foo Routes for admin
*/
Route::group(['middleware' => 'bar:admin'], function () {
Route::put('foo/{uuid}/publish', 'FooController@publish');
Route::put('foo/{uuid}/disable', 'FooController@disable');
Route::put('foo/{uuid}/enable', 'FooController@enable');
Route::delete('foo/{uuid}', 'FooController@destroy');
Route::post('foo', 'FooController@store');
Route::put('foo/{uuid}', 'FooController@update');
});
/**
* Foo Routes for creator
*/
Route::group(['middleware' => 'bar:creator'], function () {
Route::post('foo', 'FooController@store');
Route::put('foo/{uuid}', 'FooController@update');
});
这种拆分的原因是因为创建者需要从 admin 组访问两个路由,但 admin 需要对所有路由的权限。通过中间件bar 提供访问权限。
但是,每当我是 admin 并尝试访问第二个路由组中可用的两个路由之一时,我的 bar 类都会拒绝它的请求。它说我必须是creator 才能访问该路线。这是否意味着路由具有级联行为,其中路由组的最后一个实例是 laravel 使用的一个?如果是这样,我该如何格式化我的路线以避免这个问题?
bar代码:
public function handle($request, \Closure $next, ...$permissionRules)
{
.
.
.
$userPermissions = $decodedToken['user']['permissions'];
// If the user does not have every permission defined via route parameters, deny.
foreach ($permissionRules as $permissions) {
if (!in_array($permissions, $userPermissions)) {
return $this->denyResponse();
}
}
// The user has every permission rule defined via route parameters, so allow.
return $next($request);
}
【问题讨论】:
-
“这是否意味着路由具有级联行为,其中路由组的最后一个实例是 laravel 使用的那个?” -- 是的,尽管稍作修正:单个路线的最后一个实例将始终优先。