Главная Ларавел Авторизация в Laravel. Использование политик авторизации.

Ларавел


Авторизация в 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.


Комментарии

Написать комментарий