Поиск…


Вступление

Laravel предоставляет простой способ авторизации действий пользователя на определенных ресурсах. С помощью авторизации вы можете выборочно разрешать пользователям доступ к определенным ресурсам, не отказывая в доступе к другим. Laravel предоставляет простой API для управления авторизацией пользователей с помощью Gates and Policies . Gates предоставляет простой подход, основанный на закрытии, с использованием AuthServiceProvider то время как Policies позволяют организовывать логику авторизации вокруг моделей с использованием классов.

Использование ворот

Gates - это замыкания, которые определяют, разрешено ли пользователю выполнять определенное действие на ресурсе. Gates обычно определяется в методе загрузки AuthServiceProvider и лаконично назван, чтобы отразить то, что он делает. Пример шлюза, который позволяет только премиум-пользователям просматривать некоторый контент, будет выглядеть так:

Gate::define('view-content', function ($user, $content){
    return $user->isSubscribedTo($content->id);
});

A Gate всегда получает экземпляр пользователя в качестве первого аргумента, вам не нужно передавать его при использовании затвора и необязательно получать дополнительные аргументы, такие как вызывающая проблема красноречивая модель.

Авторизация действий с помощью ворот

Чтобы использовать пример выше на шаблоне клинка, чтобы скрыть контент от пользователя, вы обычно делаете что-то вроде этого:

@can('view-content', $content)
 <! -- content here -->
@endcan

Чтобы полностью предотвратить навигацию по контенту, вы можете сделать следующее в своем контроллере:

if(Gate::allows('view-content', $content)){
    /* user can view the content */
}

        OR

if(Gate::denies('view-content', $content)){
    /* user cannot view content */
}

Примечание. Вам не требуется передавать текущий аутентифицированный пользователь в этот метод, Laravel позаботится об этом для вас.

полисы

Политики - это классы, которые помогают организовать логику авторизации вокруг ресурса модели. Используя наш предыдущий пример, у нас может быть ContentPolicy который управляет доступом пользователей к модели Content .

Для того, чтобы ContentPolicy , Laravel обеспечивает команду мастеровых. Просто запустите

php artisan make:policy ContentPolicy

Это создаст пустой класс политики и разместит его в папке « app/Policies ». Если папка не существует, Laravel создаст ее и поместит класс внутрь.

После создания политики необходимо зарегистрировать, чтобы помочь Laravel узнать, какие политики использовать при авторизации действий над моделями. В AuthServiceProvider Laravel, который поставляется со всеми новыми установками Laravel, есть свойство политик, которое сопоставляет ваши красноречивые модели с их политиками авторизации. Все, что вам нужно сделать, добавить отображение в массив.

protected $policies = [
    Content::class => ContentPolicy::class,
 ];

Написание политик

Policies написания следуют по той же схеме, что и письмо Gates . В качестве политики можно переписать элемент разрешения контента:

function view($user, $content)
{
    return $user->isSubscribedTo($content->id);
}

Политики могут содержать больше методов по мере необходимости, чтобы заботиться обо всех случаях авторизации для модели.

Авторизация действий с политиками

Через модель пользователя

Модель пользователя Laravel содержит два метода, которые помогают с разрешениями с использованием Policies ; can и can't . Эти два могут использоваться, чтобы определить, имеет ли пользователь авторизацию или нет на модели, соответственно.

Чтобы проверить, может ли пользователь просматривать содержимое или нет, вы можете сделать следующее:

if($user->can('view', $content)){
    /* user can view content */
}

        OR

if($user->cant('view', $content)){
    /* user cannot view content */
}

Через промежуточное ПО

Route::get('/contents/{id}, function(Content $content){
    /* user can view content */
})->middleware('can:view,content');

Через контроллеры

Laravel предоставляет вспомогательный метод, называемый authorize который принимает имя политики и связанной модели в качестве аргументов и либо разрешает действие на основе вашей логики авторизации, либо отрицает действие, и выдает исключение AuthorizationException которое обработчик Laravel Exception преобразует в 403 HTTP response .

pubic function show($id)
{
    $content = Content::find($id);

    $this->authorize('view', $content);
        
    /* user can view content */
}


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow