Авторизация маршрутов на основе политики в Laravel
Понимание авторизации маршрутов на основе политики
Авторизация на основе политик позволяет определять правила доступа в специальных классах политик, а затем применять эти правила к маршрутам. Такой подход способствует созданию более чистого и удобного кода, отделяя логику авторизации от контроллеров.
Использование middleware can
Laravel предоставляет middleware can
для лёгкого применения авторизации на основе политики к маршрутам. Рассмотрим базовый пример:
use App\Models\Post;
Route::post('/post', function () {
// Создание поста...
})->middleware('can:create,App\Models\Post');
В этом примере маршрут защищён middleware can
, проверяющим, есть ли у аутентифицированного пользователя разрешение на создание поста.
Разбор синтаксиса
Middleware can
принимает два параметра:
- Имя метода политики, который необходимо проверить (например,
create
). - Класс или экземпляр модели, к которому должна быть применена политика
Использование 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. Такой подход не только обеспечивает безопасность маршрутов, но и способствует созданию более чистого и удобного кода за счёт разделения проблем и централизации логики авторизации.