За замовчуванням у локальному оточенні (APP_ENV=local) будь-який користувач моделі User може увійти в панель. Це зручно для розробки, але на продакшені правило інше: доступ отримують лише ті, кому це явно дозволено. Якщо нічого не налаштувати, після деплою адміністратор бачить 403.
Рішення - контракт FilamentUser:
use Filament\Models\Contracts\FilamentUser;
use Filament\Panel;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable implements FilamentUser
{
public function canAccessPanel(Panel $panel): bool
{
if ($panel->getId() === 'admin') {
return $this->is_admin && $this->hasVerifiedEmail();
}
return true; // інші панелі, наприклад кабінет клієнта
}
}
Що важливо:
- метод отримує
$panel, тож для кількох панелей умови мають бути різними. Типова помилка -return true«на швидку руку», після чого будь-який зареєстрований користувач сайту потрапляє в адмінку; canAccessPanel()- лише вхідні двері. Що саме користувач може бачити й робити всередині, вирішують політики моделей (viewAny,update,delete) - Filament перевіряє їх для ресурсів автоматично;- перевірку краще будувати на ролі чи прапорці в базі, а не на списку email у коді;
- якщо на сайті є власний вхід поза панеллю, користувач, авторизований там, усе одно проходить через
canAccessPanel()при відкритті панелі.
Як перевірити до деплою: тестом з APP_ENV не local - зайти звичайним користувачем на /admin і переконатися, що відповідь 403, а адміністратором - 200.