Загружаем изображение…
Даже в Laravel не обойтись без политики
— Как проверить права доступа к модели через Policy —
Сегодня хочу поговорить о политике.
Чего я хуже остальных, что ли... ✊
tl;dr
Возникла задача добавить проверку при удаления файла - разрешить пользователю удалять только свои собственные файлы.
Самый простой и правильный способ сделать это в Laravel - использовать Policy.
Policy - специальные классы в Laravel, позволяющие определить логику авторизации для конкретной модели или ресурса.
Преимущества подхода с политиками:
Централизация логики доступа
Поведение задаётся в одном месте - в классе политики
Переиспользование
Policy можно использовать в разных частях приложения
-- в контроллере:
-- в шаблонах:
-- в маршрутах:
Улучшение читаемости
более очевидно считывается, чем
Масштабируемость
Логика доступа со временем может усложняться (роли, админы, shared-ресурсы и т.д.), но благодаря централизованному описанию политики изменения вносятся в одном месте.
Расширяемость
Можно добавлять собственные методы политик, а не ограничиваться только стандартными.
Тестируемость
Отдельный метод политики легко покрывается тестами.
Чёткое разделение ответственности
—
—
—
Policy обнаруживаются автоматически в проекте, если структура проекта стандартная:
Laravel автоматически сопоставит:
Никакой регистрации не требуется.
(Но при необходимости политику можно зарегистрировать вручную в
—————
Политики создаются командой:
А дальше происходит магия соглашения именования и политика применяется к модели. ✨
Для своего случая я выбрал вариант проверки доступности на уровне обработки маршрута:
В итоге получается аккуратное, архитектурно правильное и читаемое решение.
Если файл принадлежит пользователю - удаляем, а нет - извините, политика. 📄
#laravel #policy #authorize #backend #web #разработка
— Как проверить права доступа к модели через Policy —
Сегодня хочу поговорить о политике.
Чего я хуже остальных, что ли... ✊
tl;dr
Проверку доступа к модели удобно выносить в Policy и подключать в карте маршрутов.
Возникла задача добавить проверку при удаления файла - разрешить пользователю удалять только свои собственные файлы.
Самый простой и правильный способ сделать это в Laravel - использовать Policy.
Policy - специальные классы в Laravel, позволяющие определить логику авторизации для конкретной модели или ресурса.
Преимущества подхода с политиками:
Централизация логики доступа
Поведение задаётся в одном месте - в классе политики
public function delete(User $user, Attachment $attachment)
{
return $attachment->user_id === $user->id;
}
Переиспользование
Policy можно использовать в разных частях приложения
-- в контроллере:
$this->authorize('delete', $attachment);
-- в шаблонах:
@can('delete', $attachment)
<button>Delete</button>
@endcan
-- в маршрутах:
->can('delete', 'attachment')
Улучшение читаемости
$this->authorize('delete', $attachment);
более очевидно считывается, чем
if ($attachment->user_id !== auth()->id())
Масштабируемость
Логика доступа со временем может усложняться (роли, админы, shared-ресурсы и т.д.), но благодаря централизованному описанию политики изменения вносятся в одном месте.
Расширяемость
Можно добавлять собственные методы политик, а не ограничиваться только стандартными.
Тестируемость
Отдельный метод политики легко покрывается тестами.
Чёткое разделение ответственности
—
Controller - обрабатывает запрос;—
Policy - определяет доступ;—
Model - определяет данные;Policy обнаруживаются автоматически в проекте, если структура проекта стандартная:
app/
├─ Models/
│ └─ Attachment.php
└─ Policies/
└─ AttachmentPolicy.php
Laravel автоматически сопоставит:
Attachment → AttachmentPolicy
Никакой регистрации не требуется.
(Но при необходимости политику можно зарегистрировать вручную в
AppServiceProvider.)—————
Политики создаются командой:
php artisan make:policy AttachmentPolicy --model=Attachment
А дальше происходит магия соглашения именования и политика применяется к модели. ✨
Для своего случая я выбрал вариант проверки доступности на уровне обработки маршрута:
Route::post('/upload/{attachment}/delete', [UploadController::class, 'delete'])
->can('delete', 'attachment')
->name('upload.remove');
В итоге получается аккуратное, архитектурно правильное и читаемое решение.
Если файл принадлежит пользователю - удаляем, а нет - извините, политика. 📄
#laravel #policy #authorize #backend #web #разработка
Просмотры: 42