Ларавел
Авторизация в Laravel. Использование политик авторизации.
В данной статье продолжение темы авторизации, начатой в статье
"Авторизация в Laravel. Использование методов класса Gate."
Для большого проекта, правила стоит сохранять не в методе boot() класса AuthServiceProvider, а в отдельных классах политик, только подключая их в классе AuthServiceProvider в защищенном свойстве $policies.
Правила указанные в политиках привязываются к конкретной сущности - модели.
Для создания класса политики авторизации, удобно использовать консоль:
php artisan make:policy PostPolicy
создастся папка и файл app\Policies\PostPolicy.php
В классе политики создаем методы проверок с названиями по которым будем к ним обращаться:
public function add($user){
foreach($user->roles as $role){
if($role->name == 'admin') return true;
}
return false;
}
public function update($user, $post){
foreach($user->roles as $role){
if($role->name == 'admin'){
return true;
}
}
if ($user->id == $post->user_id){
return true;
}
return false;
}
код проверок идентичный тому, что прописывался в методе boot() класса AuthServiceProvider в предыдущей статье.
Так же можно делать перехват проверок авторизации с помощью методов before() и after(). При использовании политик, для их использования нужно создавать соответствующий метод в классе политики:
public function before($user){
if ($user->id == 2) return true;
return false;
}
в данном случае, метод before() будет выполнен перед любым из методов проверок данного класса политики авторизации.
Зарегистрируем данную политику.
Файл app\Providers\AuthServiceProvider.php, массив
'App\Model' => 'App\Policies\ModelPolicy',
указанный в свойстве $policies удаляем, т.к. он только для примера.
Вместо него прописываем свою политику:
protected $policies = [
Post::class => PostPolicy::class,
];
ключ массива – сущность к которой привязываем (модель);
значение массива – класс политики.
Проверка политик.
1. В нужном действии контроллера.
Подключение почти аналогичное тому, которое использовалось при подключении правил указанных в методе boot(). Только при работе с политиками, аргументом, после названия правила, нужно передать сущность для которой правило создавалось (модель) – класс или объект.
Пример - проверим возможность добавления поста для текущего пользователя:
if(Gate::denies('add', Post::class)){
return redirect()->back()->with('message','Доступ запрещен.');
}
если в коде уже есть доступ к объекту, то его и передаем:
if(Gate::denies('add', $post)){
return redirect()->back()->with('message','Доступ запрещен.');
}
где $post – объект модели Post.
Пример – проверим права на редактирование поста:
$post = Post::find($request->id);
if(Gate::denies('update', $post)){
return redirect()->back()->with('message', 'Доступ запрещен.');
}
в данном примере не пришлось менять ничего кроме названия правила, т.к. для получения id поста мы и так передавали объект модели Post.
Другие статьи:
Комментарии
DarrenHot 11 Мая 2021 г.
аааабааалдееееть ----
triwpseirx 26 Марта 2021 г.
Muchas gracias. ?Como puedo iniciar sesion?
ysxtjbsdad 23 Марта 2021 г.
Muchas gracias. ?Como puedo iniciar sesion?
PhilipGutle 15 Ноября 2020 г.
Я извиняюсь, но, по-моему, Вы ошибаетесь. Могу отстоять свою позицию. Пишите мне в PM, обсудим. --- Да... Нам ешо далеко до такого... скачать фифа, скачать фифа а также скачать fifa
uqemgoxwkn 08 Ноября 2020 г.
Muchas gracias. ?Como puedo iniciar sesion?
ncylgkdvng 28 Июля 2020 г.
Muchas gracias. ?Como puedo iniciar sesion?
Mixjeade 13 Июля 2020 г.
Thank you very much for the invitation :). Best wishes. PS: How are you? I am from France :)
rardToosy 03 Декабря 2019 г.
i am from Italy hello. Can you help me translate? /rardor