Користувачі · Filament
За замовчуванням усі App\Models\User мають доступ до Filament локально. Щоб дозволити їм доступ до Filament у продакшені, потрібно зробити кілька додаткових кроків і переконатися, що доступ до застосунку отримають лише потрібні користувачі.
Авторизація доступу до панелі
Щоб налаштувати App\Models\User для доступу до Filament у нелокальних середовищах, реалізуйте контракт FilamentUser:
<?php
namespace App\Models;
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
{
return str_ends_with($this->email, '@yourdomain.com') && $this->hasVerifiedEmail();
}
}
Метод canAccessPanel() повертає true або false залежно від того, чи дозволено користувачеві доступ до $panel. У цьому прикладі ми перевіряємо, чи закінчується email користувача на @yourdomain.com і чи підтверджено його адресу.
Оскільки поточна $panel доступна всередині методу, ви можете писати умовні перевірки для окремих панелей. Наприклад, обмежити доступ лише до адмінпанелі, дозволивши всім користувачам доступ до інших панелей застосунку:
<?php
namespace App\Models;
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 str_ends_with($this->email, '@yourdomain.com') && $this->hasVerifiedEmail();
}
return true;
}
}
Авторизація доступу до ресурсів
Керування доступом до сторінок ресурсу (resource) і до його записів описано в розділі Authorization документації ресурсів.
Налаштування аватарів користувачів
З коробки Filament використовує ui-avatars.com для генерації аватарів на основі імені користувача. Якщо ж модель користувача має атрибут avatar_url, використовуватиметься він. Щоб змінити те, як Filament отримує URL аватара, реалізуйте контракт HasAvatar:
<?php
namespace App\Models;
use Filament\Models\Contracts\FilamentUser;
use Filament\Models\Contracts\HasAvatar;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable implements FilamentUser, HasAvatar
{
// ...
public function getFilamentAvatarUrl(): ?string
{
return $this->avatar_url;
}
}
Метод getFilamentAvatarUrl() використовується для отримання аватара поточного користувача. Якщо метод поверне null, Filament повернеться до ui-avatars.com.
Використання іншого провайдера аватарів
Замінити ui-avatars.com на інший сервіс легко: достатньо створити новий провайдер аватарів.
У цьому прикладі ми створюємо новий файл app/Filament/AvatarProviders/BoringAvatarsProvider.php для boringavatars.com. Метод get() приймає екземпляр моделі користувача й повертає URL аватара для цього користувача:
<?php
namespace App\Filament\AvatarProviders;
use Filament\AvatarProviders\Contracts;
use Filament\Facades\Filament;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
class BoringAvatarsProvider implements Contracts\AvatarProvider
{
public function get(Model | Authenticatable $record): string
{
$name = str(Filament::getNameForDefaultAvatar($record))
->trim()
->explode(' ')
->map(fn (string $segment): string => filled($segment) ? mb_substr($segment, 0, 1) : '')
->join(' ');
return 'https://source.boringavatars.com/beam/120/' . urlencode($name);
}
}
Тепер зареєструйте цей новий провайдер аватарів у конфігурації:
use App\Filament\AvatarProviders\BoringAvatarsProvider;
use Filament\Panel;
public function panel(Panel $panel): Panel
{
return $panel
// ...
->defaultAvatarProvider(BoringAvatarsProvider::class);
}
Налаштування атрибута з іменем користувача
За замовчуванням Filament бере атрибут name користувача, щоб показати його імʼя в застосунку. Щоб змінити це, реалізуйте контракт HasName:
<?php
namespace App\Models;
use Filament\Models\Contracts\FilamentUser;
use Filament\Models\Contracts\HasName;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable implements FilamentUser, HasName
{
// ...
public function getFilamentName(): string
{
return "{$this->first_name} {$this->last_name}";
}
}
Метод getFilamentName() використовується для отримання імені поточного користувача.
Можливості автентифікації
Увімкнути можливості автентифікації для панелі можна у файлі конфігурації:
use Filament\Panel;
public function panel(Panel $panel): Panel
{
return $panel
// ...
->login()
->registration()
->passwordReset()
->emailVerification()
->emailChangeVerification()
->profile();
}
Filament також підтримує багатофакторну автентифікацію, про яку можна почитати в розділі Multi-factor authentication.
Налаштування можливостей автентифікації
Якщо ви хочете замінити ці сторінки власними, передайте в ці методи будь-який клас сторінки Filament.
Більшості вистачить розширити базовий клас сторінки з кодової бази Filament, перевизначити методи на кшталт form() і передати новий клас сторінки в конфігурацію:
use App\Filament\Pages\Auth\EditProfile;
use Filament\Panel;
public function panel(Panel $panel): Panel
{
return $panel
// ...
->profile(EditProfile::class);
}
У цьому прикладі ми налаштуємо сторінку профілю. Треба створити новий PHP-клас у файлі app/Filament/Pages/Auth/EditProfile.php:
<?php
namespace App\Filament\Pages\Auth;
use Filament\Auth\Pages\EditProfile as BaseEditProfile;
use Filament\Forms\Components\TextInput;
use Filament\Schemas\Schema;
class EditProfile extends BaseEditProfile
{
public function form(Schema $schema): Schema
{
return $schema
->components([
TextInput::make('username')
->required()
->maxLength(255),
$this->getNameFormComponent(),
$this->getEmailFormComponent(),
$this->getPasswordFormComponent(),
$this->getPasswordConfirmationFormComponent(),
]);
}
}
Цей клас розширює базовий клас сторінки профілю з кодової бази Filament. Серед інших класів сторінок, які можна розширити:
Filament\Auth\Pages\LoginFilament\Auth\Pages\RegisterFilament\Auth\Pages\EmailVerification\EmailVerificationPromptFilament\Auth\Pages\PasswordReset\RequestPasswordResetFilament\Auth\Pages\PasswordReset\ResetPassword
У методі form() з прикладу ми викликаємо методи на кшталт getNameFormComponent(), щоб отримати стандартні компоненти форми для сторінки. Ці компоненти можна налаштувати як завгодно. Повний перелік опцій налаштування дивіться в базовому класі сторінки EditProfile у кодовій базі Filament: там зібрані всі методи, які можна перевизначити для внесення змін.
Налаштування поля автентифікації без перевизначення форми
Якщо потрібно налаштувати поле у формі автентифікації, не описуючи новий метод form(), розширте метод конкретного поля і додайте свої налаштування ланцюжком:
use Filament\Schemas\Components\Component;
protected function getPasswordFormComponent(): Component
{
return parent::getPasswordFormComponent()
->revealable(false);
}
Підтвердження зміни email
Якщо ви використовуєте можливість profile() разом із emailChangeVerification(), користувачі, які змінюють свою email-адресу у формі профілю, муситимуть підтвердити нову адресу, перш ніж зможуть увійти з нею. Для цього на нову адресу надсилається лист із посиланням, яке користувач має відкрити, щоб підтвердити нову адресу. Адреса в базі даних не оновлюється, доки користувач не перейде за посиланням із листа.
Посилання, яке отримує користувач, дійсне 60 хвилин. Одночасно з листом на нову адресу надсилається лист і на стару, з посиланням для блокування зміни. Це захисний механізм, який може вберегти користувача від дій зловмисника.
Використання бічної панелі на сторінці профілю
За замовчуванням сторінка профілю не використовує стандартний макет сторінки з бічною панеллю. Так зроблено, щоб вона працювала з можливістю tenancy: інакше вона була б недоступною для користувача без тенантів, адже посилання в бічній панелі ведуть до поточного тенанта.
Якщо ви не використовуєте tenancy у своїй панелі й хочете, щоб сторінка профілю мала стандартний макет із бічною панеллю, передайте параметр isSimple: false у $panel->profile() під час реєстрації сторінки:
use Filament\Panel;
public function panel(Panel $panel): Panel
{
return $panel
// ...
->profile(isSimple: false);
}
Налаштування слагів маршрутів автентифікації
Слаги URL для маршрутів автентифікації можна змінити в конфігурації:
use Filament\Panel;
public function panel(Panel $panel): Panel
{
return $panel
// ...
->loginRouteSlug('login')
->registrationRouteSlug('register')
->passwordResetRoutePrefix('password-reset')
->passwordResetRequestRouteSlug('request')
->passwordResetRouteSlug('reset')
->emailVerificationRoutePrefix('email-verification')
->emailVerificationPromptRouteSlug('prompt')
->emailVerificationRouteSlug('verify')
->emailChangeVerificationRoutePrefix('email-change-verification')
->emailChangeVerificationRouteSlug('verify');
}
Встановлення guard автентифікації
Щоб задати guard автентифікації, який використовує Filament, передайте імʼя guard у метод конфігурації authGuard():
use Filament\Panel;
public function panel(Panel $panel): Panel
{
return $panel
// ...
->authGuard('web');
}
Встановлення password broker
Щоб задати password broker, який використовує Filament, передайте імʼя брокера в метод конфігурації authPasswordBroker():
use Filament\Panel;
public function panel(Panel $panel): Panel
{
return $panel
// ...
->authPasswordBroker('users');
}
Вимкнення показу пароля в полях вводу
За замовчуванням усі поля паролів у формах автентифікації мають revealable(). Це дозволяє користувачеві побачити пароль, який він вводить, у вигляді звичайного тексту, натиснувши кнопку. Щоб вимкнути цю можливість, передайте false у метод конфігурації revealablePasswords():
use Filament\Panel;
public function panel(Panel $panel): Panel
{
return $panel
// ...
->revealablePasswords(false);
}
Можна також вимикати її для окремого поля, викликавши ->revealable(false) на обʼєкті поля під час розширення базового класу сторінки.
Налаштування гостьового доступу до панелі
За замовчуванням Filament розрахований на роботу лише з автентифікованими користувачами. Щоб дозволити гостям доступ до панелі, треба відмовитися від компонентів, які очікують на залогіненого користувача (профілі, аватари), і прибрати вбудований middleware автентифікації:
- Приберіть стандартний
Authenticate::classіз масивуauthMiddleware()у конфігурації панелі. - Приберіть
->login()та інші можливості автентифікації з панелі. - Приберіть стандартний
AccountWidgetіз масивуwidgets(), бо він читає дані поточного користувача.
Авторизація гостей у політиках
Якщо політики присутні, Filament покладається на Laravel Model Policies для контролю доступу. Щоб надати доступ на читання гостьовим користувачам у політиці моделі, створіть політику й оновіть методи viewAny() та view(): змініть параметр User $user на ?User $user, щоб він став необовʼязковим, і додайте return true;. Як варіант, ці методи можна прибрати з політики взагалі.
Перекладаємо з офіційної документації, розділ за розділом, і не ховаємо недоперекладене. Помітили неточність у терміні чи реченні: напишіть, виправимо.