Gates: простые проверки авторизации
Определяйте и проверяйте gates для логики разрешений действий пользователей
«Gates: простые проверки авторизации» — бесплатный урок PHP Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения PHP Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс PHP Academy содержит 4 уроков всего.
Что такое шлюзы?
Шлюзы Laravel — это замыкания, которые определяют, имеет ли пользователь право выполнить определённое действие. Это простые глобальные проверки авторизации, не связанные с конкретной моделью.
Определение шлюза
Определяйте шлюзы в App\Providers\AppServiceProvider или в отдельном AuthServiceProvider с помощью фасада Gate.
<?php
use Illuminate\Support\Facades\Gate;
// In a service provider's boot() method:
Gate::define("delete-post", function (User $user, Post $post) {
return $user->id === $post->user_id;
});Проверка шлюза (разрешение или запрет)
Проверяйте результаты работы шлюза с помощью Gate::allows() или Gate::denies().
<?php
if (Gate::allows("delete-post", $post)) {
$post->delete();
}
if (Gate::denies("delete-post", $post)) {
abort(403);
}Авторизация в контроллерах
Вызовите $this->authorize() внутри контроллера — при неудаче он автоматически выбрасывает AuthorizationException (403).
<?php
public function destroy(Post $post): RedirectResponse
{
$this->authorize("delete-post", $post);
$post->delete();
return redirect()->route("posts.index");
}@can в Blade
Используйте директиву @can, чтобы условно отображать элементы пользовательского интерфейса на основе проверок шлюза.
@can('delete-post', $post)
<form method="POST" action="/posts/{{ $post->id }}">
@csrf @method('DELETE')
<button>Delete</button>
</form>
@endcanПроверка до остальных у шлюза
Обратный вызов before выполняется до всех остальных проверок шлюза — это удобно для предоставления администраторам полного доступа.
<?php
Gate::before(function (User $user, string $ability) {
if ($user->isAdmin()) return true; // skip further checks
});Проверка после остальных у шлюза
after выполняется после всех проверок шлюза. Возвращаемое значение, отличное от null, переопределяет результат шлюза.
Возврат ответов
Шлюзы могут возвращать объект Response с пользовательскими сообщениями об ошибках.
<?php
Gate::define("publish-post", function (User $user, Post $post) {
return $user->isEditor()
? Response::allow()
: Response::deny("You must be an editor to publish.");
});forUser()
Проверьте шлюз для другого пользователя, а не для аутентифицированного.
<?php
if (Gate::forUser($otherUser)->allows("delete-post", $post)) {
// ...
}Гостевые пользователи
По умолчанию шлюзы автоматически возвращают false для неаутентифицированных пользователей. Укажите для пользователя допускающий значение null тип, чтобы разрешить проверки для гостей.
<?php
Gate::define("view-post", function (?User $user, Post $post) {
return $post->is_published || $user?->id === $post->user_id;
});Шлюзы и политики
Шлюзы — это простые замыкания для разовых проверок. Политики — это классы для авторизации на основе модели; используйте политики, когда у вас несколько действий над одной моделью.
Итоги
Шлюзы — это глобальные замыкания для авторизации. Определяйте их в поставщике служб. Проверяйте их с помощью Gate::allows(), $this->authorize() или @can в Blade.
Быстрая проверка
Какой метод контроллера автоматически выбрасывает 403 при сбое проверки шлюза?
Часто задаваемые вопросы
Урок «Gates: простые проверки авторизации» бесплатный?
Да — полный текст урока «Gates: простые проверки авторизации» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс PHP Academy, подпишись на CoddyKit PRO. Курс PHP Academy содержит 4 уроков всего.
Чему я научусь в уроке «Gates: простые проверки авторизации»?
Определяйте и проверяйте gates для логики разрешений действий пользователей Ты практикуешь PHP Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать PHP Academy?
Предыдущий опыт не требуется. PHP Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Gates: простые проверки авторизации»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке PHP Academy?
Да. Каждый урок PHP Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Аутентификация с Laravel Breeze
- Защита маршрутов с помощью промежуточного ПО
- Gates: простые проверки авторизации
- Политики: авторизация на основе моделей