Маршруты Laravel: одни и те же маршруты в двух разных группах маршрутов - PullRequest
0 голосов
/ 09 мая 2018

В настоящее время у меня есть две группы маршрутов, где одна группа маршрутов имеет шесть маршрутов, а другая имеет два маршрута (которые также находятся в предыдущей группе).

/**
 * 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');
});

Причина такого разделения заключается в том, что создателю необходим доступ к двум маршрутам из группы администраторов, но администратору необходимо разрешение на все маршруты. Доступ предоставляется через промежуточное ПО 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);
}

1 Ответ

0 голосов
/ 10 мая 2018

Правильный способ сделать это - настроить промежуточное ПО, которое вы используете (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();
}

Это должно быть все, что вам нужно. Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...