Авторизация маршрутов на основе политики в Laravel

Источник: «Securing Routes with Policy-Based Authorization in Laravel»
Система авторизации Laravel, основанная на политиках, предоставляет мощный способ управления контролем доступа в приложениях. В сочетании с middleware маршрутов она предлагает чистый и эффективный метод обеспечения безопасности маршрутов на основе прав пользователей. Рассмотрим, как реализовать авторизацию маршрутов на основе политик с помощью middleware 'can'.

Понимание авторизации маршрутов на основе политики

Авторизация на основе политик позволяет определять правила доступа в специальных классах политик, а затем применять эти правила к маршрутам. Такой подход способствует созданию более чистого и удобного кода, отделяя логику авторизации от контроллеров.

Использование middleware can

Laravel предоставляет middleware can для лёгкого применения авторизации на основе политики к маршрутам. Рассмотрим базовый пример:

use App\Models\Post;

Route::post('/post', function () {
// Создание поста...
})->middleware('can:create,App\Models\Post');

В этом примере маршрут защищён middleware can, проверяющим, есть ли у аутентифицированного пользователя разрешение на создание поста.

Разбор синтаксиса

Middleware can принимает два параметра:

Использование route::can() для более чистого синтаксиса

Laravel также предлагает метод can() на фасаде Route для более удобного синтаксиса:

use App\Models\Post;

Route::post('/post', function () {
// Создание поста...
})->can('create', Post::class);

Это даёт тот же результат, что и предыдущий пример, но с более чистым и читабельным синтаксисом.

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

Если необходимо разрешить действия над конкретным экземпляром модели, можно передать экземпляр напрямую:

Route::put('/post/{post}', function (Post $post) {
// Обновление поста...
})->can('update', 'post');

Здесь Laravel автоматически разрешает параметр post из маршрута и передаёт его в политику.

Обработка ошибок авторизации

По умолчанию при неудачной авторизации Laravel генерирует HTTP-ответ 403. Вы можете настроить это поведение в классе App\Exceptions\Handler.

Реальные примеры

Защита маршрута обновления профиля пользователя:

Route::put('/user/{user}', [UserController::class, 'update'])
->can('update', 'user');

Защита панели управления администратора:

Route::get('/admin/dashboard', [AdminController::class, 'index'])
->can('viewAdminDashboard', User::class);

Управление видимостью статьи:

Route::get('/articles/{article}', [ArticleController::class, 'show'])
->can('view', 'article');

Комбинирование с группами маршрутов

Для более эффективного определения маршрутов можно применять middleware can к целым группам маршрутов:

Route::middleware('can:manage-posts')->group(function () {
Route::get('/posts/create', [PostController::class, 'create']);
Route::post('/posts', [PostController::class, 'store']);
Route::get('/posts/{post}/edit', [PostController::class, 'edit']);
Route::put('/posts/{post}', [PostController::class, 'update']);
Route::delete('/posts/{post}', [PostController::class, 'destroy']);
});

Это применит проверку политики manage-posts ко всем маршрутам в группе.

Используя авторизацию маршрутов на основе политик, можно создать надёжную, масштабируемую систему авторизации для приложения Laravel. Такой подход не только обеспечивает безопасность маршрутов, но и способствует созданию более чистого и удобного кода за счёт разделения проблем и централизации логики авторизации.

Комментарии


Дополнительные материалы

Предыдущая Статья

Гибкое кэширование в Laravel — это очень просто

Следующая Статья

Отладка SQL запросов в Laravel