Правильный способ сделать это - настроить промежуточное ПО, которое вы используете (bar
), для принятия нескольких разрешений / ролей.
Простой способ сделать это - передать список допустимых разрешений через запятую, преобразовать его в массив и проверить, есть ли у пользователя Auth пропущенные разрешения.
Чтобы использовать код, который вы дали нам изначально, вот способ реализовать:
Сначала создайте новую группу маршрутов для группы разрешений:
/**
* 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');
});
/**
* Foo Routes for creator
*/
Route::group(['middleware' => 'bar:creator'], function () {
// Other Routes available only to Creator permission users
});
/**
* Foo Routes for creator & admin
*/
Route::group(['middleware' => 'bar:creator,admin'], function () {
Route::post('foo', 'FooController@store');
Route::put('foo/{uuid}', 'FooController@update');
});
Во-вторых, обновите bar
промежуточное ПО для преобразования строки, разделенной запятыми, в массив
public function handle($request, \Closure $next, ...$permissionRules)
{
.
.
.
$permissionRules = explode(',', $permissionRules);
$userPermissions = $decodedToken['user']['permissions']; //Assuming this is an array of the Auth'ed user permissions.
// If the user does not have every permission defined via route
parameters, deny.
foreach ($permissionRules as $permission) {
if (in_array($permission, $userPermissions)) {
// Change this to see if the permission is in the array, opposed to NOT in the array
return $next($request);
}
}
// Made it so that if the permission is NOT found in the array then Deny
return $this->denyResponse();
}
Это должно быть все, что вам нужно. Надеюсь, это поможет!