РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
734 of 1392 menu

Класс Gate

Класс Gate в Laravel является основным инструментом для управления авторизацией. Он позволяет определять разрешения (abilities) и проверять, может ли пользователь выполнять определённые действия. Первым параметром в методы класса передаётся имя действия, вторым - модель или идентификатор ресурса. Класс Gate работает поверх системы аутентификации и использует текущего аутентифицированного пользователя.

Определение прав доступа

Для определения прав используется метод define. Первым параметром передаётся имя действия, вторым - замыкание, которое принимает пользователя и дополнительные аргументы:

<?php namespace App\Providers; use App\Models\Article; use App\Models\User; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; use Illuminate\Support\Facades\Gate; class AuthServiceProvider extends ServiceProvider { public function boot(): void { Gate::define('update-article', function (User $user, Article $article) { return $user->id === $article->user_id; }); } } ?>

Проверка прав доступа

Метод allows проверяет, разрешено ли действие пользователю. Возвращает true или false:

<?php namespace App\Http\Controllers; use App\Models\Article; use App\Models\User; use Illuminate\Support\Facades\Gate; class ArticleController extends Controller { public function edit(int $id) { $article = Article::find($id); if (Gate::allows('update-article', $article)) { echo "You can edit this article."; } else { echo "You cannot edit this article."; } } } ?>

Результат выполнения кода для пользователя, который является автором статьи:

"You can edit this article."

Проверка запрета доступа

Метод denies работает противоположно allows и возвращает true, если действие запрещено:

<?php namespace App\Http\Controllers; use App\Models\Article; use App\Models\User; use Illuminate\Support\Facades\Gate; class ArticleController extends Controller { public function delete(int $id) { $article = Article::find($id); if (Gate::denies('update-article', $article)) { echo "You cannot delete this article."; } else { echo "Article deleted."; } } } ?>

Результат выполнения кода для пользователя, который не является автором статьи:

"You cannot delete this article."

Использование метода authorize

Метод authorize выбрасывает исключение AuthorizationException при запрете доступа. Используется в контроллерах:

<?php namespace App\Http\Controllers; use App\Models\Article; use App\Models\User; use Illuminate\Support\Facades\Gate; class ArticleController extends Controller { public function edit(int $id) { $article = Article::find($id); Gate::authorize('update-article', $article); echo "You can edit this article."; } } ?>

Проверка через Blade-директиву

В Blade-шаблонах используется директива @can для условного отображения контента:

@can('update-article', $article) <a href="/articles/{{ $article->id }}/edit">Edit article</a> @endcan

Проверка нескольких прав

Методы any и none позволяют проверить несколько действий одновременно. Метод any возвращает true, если хотя бы одно действие разрешено:

<?php namespace App\Http\Controllers; use App\Models\Article; use App\Models\User; use Illuminate\Support\Facades\Gate; class ArticleController extends Controller { public function manage(int $id) { $article = Article::find($id); if (Gate::any(['update-article', 'delete-article'], $article)) { echo "You can manage this article."; } else { echo "You cannot manage this article."; } } } ?>

Метод none возвращает true, если все действия запрещены:

<?php namespace App\Http\Controllers; use App\Models\Article; use App\Models\User; use Illuminate\Support\Facades\Gate; class ArticleController extends Controller { public function check(int $id) { $article = Article::find($id); if (Gate::none(['update-article', 'delete-article'], $article)) { echo "You have no permissions for this article."; } } } ?>

Смотрите также

  • фасад Auth,
    который отвечает за аутентификацию пользователей
  • метод user,
    который возвращает текущего аутентифицированного пользователя
  • метод check,
    который проверяет разрешение для текущего пользователя
  • метод can,
    который проверяет права непосредственно у модели пользователя
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить