Политики: авторизация на основе моделей
Привязывайте политики к моделям Eloquent и используйте их в контроллерах
«Политики: авторизация на основе моделей» — бесплатный урок PHP Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения PHP Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс PHP Academy содержит 4 уроков всего.
Что такое политика?
Политика — это класс, который организует логику авторизации для конкретной модели Eloquent. Политики рекомендуются, когда для одной модели предусмотрено несколько действий авторизации.
Создание политики
Используйте Artisan, чтобы сгенерировать политику. Добавьте --model, чтобы предварительно заполнить стандартные методы.
$ php artisan make:policy PostPolicy --model=PostМетоды политики
Каждый метод соответствует действию. Он получает аутентифицированного пользователя и экземпляр модели.
<?php
class PostPolicy
{
public function view(?User $user, Post $post): bool
{
return $post->is_published || $user?->id === $post->user_id;
}
public function update(User $user, Post $post): bool
{
return $user->id === $post->user_id;
}
public function delete(User $user, Post $post): bool
{
return $user->id === $post->user_id || $user->isAdmin();
}
}Регистрация политик
В Laravel 11 и новее политики обнаруживаются автоматически, если они соответствуют соглашениям об именовании (модель Post → PostPolicy). Также их можно зарегистрировать вручную в AuthServiceProvider.
Использование политик в контроллерах
Вызовите $this->authorize("action", $model) — Laravel автоматически найдёт соответствующую политику.
<?php
public function update(Request $request, Post $post): RedirectResponse
{
$this->authorize("update", $post);
$post->update($request->validated());
return redirect()->route("posts.show", $post);
}Политика в Blade
Директива @can работает с политиками так же, как со шлюзами.
@can('update', $post)
<a href="/posts/{{ $post->id }}/edit">Edit</a>
@endcanМетод, выполняемый до остальных
Необязательный метод политики before() выполняется до остальных методов. Верните true, чтобы предоставить полный доступ (например, администраторам).
<?php
public function before(User $user, string $ability): ?bool
{
if ($user->isAdmin()) return true;
return null; // continue to specific method
}Действие создания (без экземпляра модели)
Метод политики create получает только пользователя (без модели), поскольку экземпляр ещё не существует.
<?php
public function create(User $user): bool
{
return $user->hasVerifiedEmail();
}Ручная проверка политик
Используйте фасад Gate или модель пользователя, чтобы напрямую проверять политики.
<?php
Gate::allows("update", $post); // true/false
$user->can("update", $post); // true/false
$user->cannot("delete", $post); // true/falseОтветы политик
Возвращайте объект Response из метода политики, чтобы настроить сообщение об отказе.
<?php
use Illuminate\Auth\Access\Response;
public function publish(User $user, Post $post): Response
{
return $user->isEditor()
? Response::allow()
: Response::deny("Only editors can publish posts.");
}Тестирование политик
Тестируйте политики в PHPUnit, выполняя действия от имени определённого пользователя.
<?php
public function test_owner_can_delete_post(): void
{
$user = User::factory()->create();
$post = Post::factory()->create(["user_id" => $user->id]);
$this->assertTrue($user->can("delete", $post));
}Итоги
Политики объединяют авторизацию на уровне моделей. Создавайте их с помощью make:policy --model. Используйте $this->authorize() в контроллерах и @can в Blade. Применяйте before() для обхода проверок администраторами.
Быстрая проверка
Какой метод политики получает только пользователя, без экземпляра модели?
Часто задаваемые вопросы
Урок «Политики: авторизация на основе моделей» бесплатный?
Да — полный текст урока «Политики: авторизация на основе моделей» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс PHP Academy, подпишись на CoddyKit PRO. Курс PHP Academy содержит 4 уроков всего.
Чему я научусь в уроке «Политики: авторизация на основе моделей»?
Привязывайте политики к моделям Eloquent и используйте их в контроллерах Ты практикуешь PHP Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать PHP Academy?
Предыдущий опыт не требуется. PHP Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Политики: авторизация на основе моделей»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке PHP Academy?
Да. Каждый урок PHP Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Аутентификация с Laravel Breeze
- Защита маршрутов с помощью промежуточного ПО
- Gates: простые проверки авторизации
- Политики: авторизация на основе моделей