Поиск…
Вступление
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 */
}