Метод before
Метод before класса Gate позволяет зарегистрировать глобальную проверку,
которая выполняется перед всеми остальными проверками прав доступа.
Это полезно для предоставления супер-администраторам полного доступа
ко всем возможностям системы без необходимости определять отдельные
правила для каждого действия. Первым параметром передаётся замыкание,
которое принимает текущего пользователя и, опционально, дополнительные
аргументы, и должно возвращать true, false или null.
Если замыкание возвращает не null, то это значение будет использовано
как результат проверки, и остальные правила не будут выполняться.
Синтаксис
<?php
Gate::before($callback);
?>
Пример
Давайте зарегистрируем глобальную проверку, которая даёт полный доступ
пользователю с ролью 'admin':
<?php
namespace AppProviders;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
class AuthServiceProvider extends ServiceProvider
{
public function boot(): void
{
Gate::before(function ($user, $ability) {
if ($user->role === 'admin') {
return true;
}
return null;
});
}
}
?>
Пример
Теперь проверим доступ для администратора к любому действию:
<?php
use Illuminate\Support\Facades\Gate;
use App\Models\User;
Route::get('/admin/panel', function () {
$user = User::find(1);
if (Gate::forUser($user)->allows('edit-posts')) {
echo "Access granted to edit posts";
}
if (Gate::forUser($user)->allows('delete-users')) {
echo "Access granted to delete users";
}
});
?>
Результат выполнения кода:
"Access granted to edit postsAccess granted to delete users"
Пример
Метод before может использоваться для блокировки доступа
для забаненных пользователей:
<?php
namespace AppProviders;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
class AuthServiceProvider extends ServiceProvider
{
public function boot(): void
{
Gate::before(function ($user, $ability) {
if ($user->is_banned) {
return false;
}
return null;
});
Gate::define('edit-posts', function ($user) {
return $user->role === 'editor';
});
}
}
?>
Пример
Проверим доступ для забаненного пользователя:
<?php
use Illuminate\Support\Facades\Gate;
use App\Models\User;
Route::get('/check-access', function () {
$user = User::find(2);
if (Gate::forUser($user)->denies('edit-posts')) {
echo "Access denied";
}
});
?>
Результат выполнения кода:
"Access denied"