Лекция Тесты
контроль доступа (Access Control) — это комплексный процесс, включающий:
авторизация — это процесс, который позволяет пользователю получить доступ к определенным ресурсам или функциям системы после успешной аутентификации. Она включает в себя проверку прав доступа и определение, какие действия может выполнять пользователь. Авторизация — это процесс, следующий за идентификацией и аутентификацией.

В Laravel система авторизации построена вокруг двух ключевых понятий — Policies (политики) и Gates (гейты).
Policies — это классы, которые описывают правила доступа к конкретным моделям. Например, можно определить, кто может создавать, редактировать или удалять посты. Политики удобно использовать, когда нужно связать права доступа с конкретными объектами базы данных.
Gates — это глобальные проверки авторизации, которые определяются как функции. Они подходят для простых правил, не привязанных к конкретной модели. Например, можно создать гейт, который проверяет, является ли пользователь администратором.
Laravel также предоставляет удобные методы и директивы:
Таким образом, политики и гейты позволяют гибко управлять доступом к ресурсам и действиям в приложении.

В Laravel политика с моделями используется для авторизации действий над конкретными экземплярами Eloquent‑моделей. Политика связывается с моделью и определяет методы (view, update, delete и т.д.), которые автоматически проверяются через контроллеры, маршруты и Blade.


порядок проверки

В Laravel Gate::before и Gate::after позволяют перехватывать процесс авторизации до и после выполнения конкретных правил. before чаще используется для глобальных прав (например, админ всегда имеет доступ), а after — для логирования или дополнительной проверки после основного решения.
Gate::before: выполняется до проверки конкретного правила. Если вернет true или false, то результат будет окончательным и правила не будут проверяться.
Gate::after: выполняется после проверки правила. Может использоваться для логирования, аудита или дополнительной логики, но не изменяет исходное решение (только если явно вернуть true/false).
Пример использования Gate::before и Gate::after
use Illuminate\Support\Facades\Gate;
Gate::before(function ($user, $ability) {
// Админ всегда имеет доступ
if ($user->isAdmin()) {
return true;
}
});
Gate::after(function ($user, $ability, $result) {
// Логирование результата авторизации
\Log::info("User {$user->id} tried {$ability}: " . ($result ? 'granted' : 'denied'));
});
В before проверяется, является ли пользователь админом. Если да — доступ разрешен без проверки остальных правил.
В after фиксируется результат проверки (например, для аудита или статистики).
Когда применять в Laravel Gate::before и Gate::after
before:
Глобальные права (например, супер-админ).
Универсальные исключения (например, пользователи с определенной ролью).
after:
Логирование и аудит действий.
Отправка уведомлений о попытках доступа.
Дополнительные проверки, которые не должны влиять на основное решение.
Сравнение Gate::before и Gate::after
| Характеристика | Gate::before | Gate::after |
|---|---|---|
| Время выполнения | До проверки правил | После проверки правил |
| Может изменить результат | Да | Обычно нет (только если явно вернуть) |
| Типичные задачи | Глобальные права, супер-админ | Логирование, аудит, уведомления |
| Применение | Универсальные исключения | Аналитика и мониторинг |
В реальном проекте на Laravel:
before удобно использовать для админов или системных пользователей, чтобы не прописывать их права в каждой политике.
after полезно для журналирования действий, особенно в корпоративных системах, где важно отслеживать попытки доступа.
php artisan make:policy PostPolicy --model=Post
Флаг --model=Post сразу связывает политику с моделью Post.
В классе PostPolicy будут методы: view, create, update, delete, restore, forceDelete.
В AuthServiceProvider:
protected $policies = [
\App\Models\Post::class => \App\Policies\PostPolicy::class,
];
Laravel автоматически подтянет политику для модели.
Прямая проверка:
public function update(Post $post)
{
$this->authorize('update', $post);
// обновление поста
}
Ресурсная проверка:
public function __construct()
{
$this->authorizeResource(Post::class, 'post');
}
Здесь 'post' — имя параметра маршрута, через который модель извлекается.
Метод authorize
public function update(Post $post)
{
$this->authorize('update', $post);
// логика обновления
}
Проверка политики для конкретного действия.
Метод authorizeResource В конструкторе контроллера можно связать ресурсные методы с политикой:
public function __construct()
{
$this->authorizeResource(Post::class, 'post');
}
Теперь методы index, show, create, update, delete будут автоматически проверяться.
Route::delete('/posts/{post}', [PostController::class, 'destroy'])
->middleware('can:delete,post');
Middleware can проверяет метод политики delete для модели Post.
Через middleware can
Route::get('/post/{post}/edit', [PostController::class, 'edit'])
->middleware('can:update,post');
Здесь проверяется политика update для модели Post.
Для ресурсных маршрутов Можно комбинировать с authorizeResource в контроллере, чтобы не прописывать middleware вручную.
Директива @can
@can('update', $post)
a href="{{ route('post.edit', $post) }}" Редактировать /a
@endcan
Директива @cannot
@cannot('delete', $post)
p Удаление недоступно /p
@endcannot
Директива @canany
@canany(['update', 'delete'], $post)
p Вы можете редактировать или удалять пост/p
@endcanany
@can('update', $post)
a href="{{ route('posts.edit', $post) }}" Редактировать/a
@endcan
@cannot('delete', $post)
p Удаление недоступно
| Метод контроллера | Метод политики | Параметр модели |
|---|---|---|
| index | viewAny | — |
| show | view | Post $post |
| create | create | — |
| store | create | — |
| edit | update | Post $post |
| update | update | Post $post |
| destroy | delete | Post $post |
| Место применения | Пример | Когда использовать |
|---|---|---|
| Контроллер | $this->authorize('update', $post) | Логика внутри метода |
| Контроллер (ресурсный) | $this->authorizeResource(Post::class, 'post') | Автоматическая проверка для CRUD |
| Маршрут | ->middleware('can:update,post') | Ограничение доступа на уровне маршрута |
| Вьюха | @can('update', $post) | Отображение элементов интерфейса |
Использовать Gates и Policies в Laravel для фильтрации данных по владельцу — это корректный и рекомендуемый подход, но важно понимать их назначение: они отвечают за авторизацию действий, а не за саму выборку данных. Для фильтрации Eloquent-запросов лучше комбинировать политики с query scopes или middleware.
// PostPolicy.php
public function view(User $user, Post $post)
{
return $user->id === $post->user_id;
}
public function index()
{
$posts = Post::where('user_id', auth()->id())->get();
return view('posts.index', compact('posts'));
}
// В модели Post
public function scopeOwnedBy($query, $userId)
{
return $query->where('user_id', $userId);
}
// Использование
$posts = Post::ownedBy(auth()->id())->get();
// PostPolicy.php
public function viewAny(User $user)
{
return $user->role_id === RolesEnum::ADMIN->value;
}
// В модели Post
public function scopeOwnedBy($query)
{
if (auth()->user()->can('viewAny', Post::class)) {
return $query; // админ видит все
}
return $query->where('user_id', auth()->id());
}
или
// PostPolicy.php
public function viewNotOwner(User $user)
{
// например, модератор может видеть чужие посты
return $user->is_moderator;
}
// В модели Post
public function scopeVisibleFor($query)
{
$user = auth()->user();
if ($user->can('viewNotOwner', Post::class)) {
// модератор видит все посты, кроме своих
return $query->where('user_id', '!=', $user->id);
}
// обычный пользователь видит только свои
return $query->where('user_id', $user->id);
}
Но если есть смешение их, код становится менее прозрачным: scope начинает решать задачи авторизации, хотя его роль — только фильтрация и архитектурно менее чисто.
В Laravel политики можно использовать в нескольких слоях приложения — контроллерах, маршрутах и даже во вьюхах.
| Подход | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Policies | Централизованная авторизация, легко тестировать | Не фильтруют сами данные | Проверка доступа к конкретной модели |
| Scopes | Чистый код, переиспользуемость | Нужно помнить о вызове | Фильтрация выборок по владельцу |
| Middleware | Универсально, можно ограничить доступ к маршрутам | Менее гибко для сложных условий | Ограничение доступа к целым ресурсам |
Каждый вопрос имеет 4 варианта ответа.
Только один вариант правильный — он отмечен символом *.
После списка ответов идет подсказка, которая кратко объясняет правильный выбор.
Рекомендуется сначала попробовать ответить самостоятельно, а затем свериться с правильным вариантом и прочитать подсказку.
Тест можно проходить последовательно или выборочно — он охватывает разные аспекты авторизации в Laravel.
1. В какой последовательности выплняется Контроль доступа (Access Control) в онлайн сервисах:
Все три процесса — идентификация, аутентификация и авторизация — вместе обычно обозначаются как контроль доступа или управление доступом (Access Control). В IT‑сфере их рассматривают как последовательные этапы единого механизма обеспечения безопасности при взаимодействии пользователя с системой.
2. Как создать Policy в Laravel?
Используется команда artisan make:policy.
3. Где регистрируются Policy?
Все политики регистрируются в AuthServiceProvider.
4. Что такое Gate в Laravel?
Gate — это глобальная функция авторизации.
5. Как определить Gate?
Gate определяется через Gate::define.
6. Как вызвать Gate в коде?
Проверка выполняется через Gate::check или Gate::allows.
7. Что делает метод authorize() в контроллере?
authorize() вызывает соответствующую политику.
8. Какой метод Policy проверяет доступ к конкретной модели?
Policy обычно содержит методы для каждой операции: view, update, delete.
9. Что возвращает метод Gate::allows()?
Gate::allows возвращает булево значение.

10. Как связать Policy с моделью?
В AuthServiceProvider указывают соответствие модели и политики.
11. Что делает метод can() у пользователя?
can() — удобный метод для проверки авторизации.
12. Какой Blade-директивой проверяют права?
@can используется для проверки прав доступа в шаблонах.
13. Что делает метод deny() в Policy?
deny() возвращает отказ в доступе.
14. Какой middleware отвечает за авторизацию?
Middleware can проверяет права доступа.
15. Что лучше использовать для сложной логики авторизации?
Для сложной логики применяют комбинацию Policy и Gate.
16. Что делает метод Gate::denies()?
denies() противоположен allows(), возвращает true при отказе.

17. Какой метод Policy используется для проверки удаления модели?
Метод delete() определяет доступ к удалению.
18. Как вызвать проверку Policy напрямую в контроллере?
authorize() вызывает метод политики для модели.
19. Что делает метод before() в Policy?
before() позволяет глобально разрешить или запретить доступ.
20. Какой метод используется для массового просмотра моделей?
viewAny() проверяет доступ к списку моделей.
21. Что делает метод Gate::forUser($user)?
forUser позволяет проверить права другого пользователя.

22. Какой Blade-директивой проверяют отказ в доступе?
@cannot используется для проверки запрета.
23. Что делает метод Gate::inspect()?
inspect() дает подробный результат проверки.
24. Какой метод Policy проверяет создание модели?
create() отвечает за доступ к созданию.
25. Что делает метод Gate::authorize()?
authorize() выбрасывает исключение, если доступ запрещен.

26. Какой метод Policy проверяет обновление модели?
update() отвечает за доступ к изменению.
27. Что делает метод Gate::abilities()?
abilities() возвращает массив всех гейтов.
28. Какой метод Policy проверяет просмотр модели?
view() отвечает за доступ к просмотру.
29. Что делает метод Gate::any(['edit','delete'])?
any() возвращает true, если хотя бы одно правило выполняется.

30. Какой метод Policy проверяет восстановление модели?
restore() отвечает за доступ к восстановлению.
31. Какой метод Policy проверяет окончательное удаление модели?
forceDelete() используется для проверки доступа к безвозвратному удалению.
32. Что делает метод Gate::none(['edit','delete'])?
none() возвращает true, если ни одно правило не разрешено.

33. Какой метод Policy проверяет массовое удаление моделей?
deleteAny() отвечает за доступ к массовому удалению.
34. Что делает метод Gate::after()?
after() позволяет глобально изменить результат проверки.
35. Какой метод Policy проверяет массовое создание моделей?
createAny() отвечает за доступ к массовому созданию.
36. Что делает метод Gate::before()?
before() позволяет задать глобальное правило до остальных.

37. Какой Blade-директивой проверяют несколько прав сразу?
@canany проверяет наличие хотя бы одного разрешения.
38. Что делает метод Gate::check()?
check() используется для проверки доступа.

39. Какой метод Policy проверяет массовое обновление моделей?
updateAny() отвечает за доступ к массовому обновлению.
40. Что делает метод Gate::allows()?
allows() возвращает true при разрешении доступа.
41. Какой метод Policy проверяет массовое восстановление моделей?
restoreAny() отвечает за доступ к массовому восстановлению.
42. Что делает метод Gate::authorize() при отказе?
authorize() выбрасывает исключение при отказе в доступе.
43. Какой метод Policy проверяет массовый просмотр моделей?
viewAny() используется для проверки доступа к списку моделей.
44. Что делает метод Gate::forUser()?
forUser позволяет проверить права другого пользователя.

45. Какой метод Policy проверяет массовое окончательное удаление моделей?
forceDeleteAny() отвечает за доступ к массовому окончательному удалению.
46. Какой метод Policy проверяет массовое редактирование моделей?
updateAny() используется для проверки доступа к массовому редактированию.
47. Что делает метод Gate::define()?
define() используется для регистрации нового гейта.
48. Какой Blade-директивой проверяют несколько правил одновременно?
@canany проверяет наличие хотя бы одного разрешения.
49. Какой метод Policy проверяет удаление модели?
delete() определяет доступ к удалению.
50. Что делает метод Gate::allows() при успешной проверке?
allows() возвращает true, если доступ разрешен.
51. Какой Blade-директивой проверяют права на конкретное действие?
@can используется для проверки прав доступа в шаблонах.
52. Что такое Policy в Laravel?
Policy — это объектная форма авторизации, проверяющая права пользователя.
53. Какой HTTP-код обычно возвращается при ошибке аутентификации (например, неверный токен или отсутствие авторизации)?
401 Unauthorized — клиент не прошел аутентификацию (неверный токен, отсутствует логин).

54. Какой HTTP-код обычно возвращается при ошибке авторизации (например, доступ к ресурсу есть, но прав недостаточно)?
403 Forbidden — клиент аутентифицирован, но не имеет прав для выполнения действия.

Комментарии