Использование единого метода политики для покрытия каждого действия на ресурсе - PullRequest
0 голосов
/ 11 октября 2018

У меня есть ресурс с именем Post.Каждый Post относится к одному User, а User может иметь несколько (или ноль) Posts.

. Я использую Route::resource для отображения маршрутов для каждого возможного действия наресурс Post для одного контроллера ресурса, PostController.

Теперь я хочу реализовать политику для ресурса Post.Стремясь сделать все как можно более простым и надежным, я хотел бы сделать политику следующим образом:

  • Каждый пользователь имеет право совершать любые действия, не требующие существующего Post (например, создать).
  • A User имеет право доступа к своему собственному Posts только для каждого действия, которое обращается к Post (например, редактирование, обновление, удаление).

Сейчас я пытаюсь создать единый метод политики с именем access, который бы проверял, что Post принадлежит User.Затем в моем PostController каждый метод, в параметрах которого есть объект Post (например, edit(Post $post)), будет начинаться с

$this->authorize('access', $post);

Однако я неМне не нужно ставить эти строки вручную.Если я когда-нибудь забуду один из них, у меня будет дыра в безопасности.

С другой стороны, у меня есть метод authorizeResource, который делает авторизацию автоматической, но требует, чтобы в политике было несколько методов, поэтомуони сопоставлены с каждым из методов контроллера.Кроме того, я попытался использовать промежуточное программное обеспечение Authorize / can , но оно не сработало (возможно, потому что я использовал его для сопоставления Route::resource).

Вопросявляется: Каков был бы самый чистый и более безопасный способ достижения результата, который я описал (т.е. авторизация каждого возможного действия, которое обращается к ресурсу с точно таким же правилом)?

1 Ответ

0 голосов
/ 12 октября 2018

Вы можете использовать authorizeResource() и переопределить метод resourceAbilityMap() в вашем контроллере.Последний метод возвращает отображение из методов контроллера в методы политики, которые будут вызваны.

https://github.com/laravel/framework/blob/5.7/src/Illuminate/Foundation/Auth/Access/AuthorizesRequests.php#L105

Например,

class MyController extends Controller
{
    // ...

    /**
     * Get the map of resource methods to ability names.
     *
     * @return array
     */
    protected function resourceAbilityMap()
    {
        return [
            'edit' => 'access',
            'update' => 'access',
            'destroy' => 'access',
        ];
    }

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