Класс 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.";
}
}
}
?>