- Обзор работы с пользователями в Filament Panel Builder
- Авторизация доступа к панели
- Настройка аватаров пользователей
- Настройка атрибута имени пользователя
- Функции аутентификации
Обзор работы с пользователями в Filament Panel Builder
По умолчанию все пользователи App\Models\Users
могут получить доступ к Filament локально. Чтобы разрешить им доступ к Filament в production, необходимо предпринять несколько дополнительных шагов, гарантирующих, что доступ к приложению получат только нужные пользователи.
Авторизация доступа к панели
Чтобы настроить модель 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
. В рассматриваемом примере мы проверяем, заканчивается ли адрес электронной почты пользователя на @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;
}
}
Настройка аватаров пользователей
Из коробки Filament использует сервис ui-avatars.com для генерации аватаров на основе имени пользователя. Однако если в модели пользователя есть атрибут avatar_url
, то он будет использоваться вместо него. Чтобы настроить получение URL-адреса аватара пользователя в Filament, можно реализовать условия использования 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\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()
->profile();
}
Настройка функций аутентификации
Если требуется заменить эти страницы на свои собственные, то в эти методы можно передать любой класс страницы 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\Forms\Components\TextInput;
use Filament\Forms\Form;
use Filament\Pages\Auth\EditProfile as BaseEditProfile;
class EditProfile extends BaseEditProfile
{
public function form(Form $form): Form
{
return $form
->schema([
TextInput::make('username')
->required()
->maxLength(255),
$this->getNameFormComponent(),
$this->getEmailFormComponent(),
$this->getPasswordFormComponent(),
$this->getPasswordConfirmationFormComponent(),
]);
}
}
Этот класс расширяет базовый класс страницы профиля из кодовой базы Filament. Другие классы страниц, которые вы можете расширить, включают:
Filament\Pages\Auth\Login
Filament\Pages\Auth\Register
Filament\Pages\Auth\EmailVerification\EmailVerificationPrompt
Filament\Pages\Auth\PasswordReset\RequestPasswordReset
Filament\Pages\Auth\PasswordReset\ResetPassword
В методе form()
приведенного примера мы вызываем такие методы, как getNameFormComponent()
, чтобы получить компоненты формы по умолчанию для данной страницы. Вы можете настроить эти компоненты по своему усмотрению. Все доступные возможности настройки см. в базовом классе страницы EditProfile
в кодовой базе Filament - он содержит все методы, которые можно переопределить для внесения изменений.
Настройка службы защиты аутентификации
Чтобы задать защиту аутентификации, которую использует Filament, можно передать имя этой защиты в метод конфигурации authGuard()
:
use Filament\Panel;
public function panel(Panel $panel): Panel
{
return $panel
// ...
->authGuard('web');
}
Настройка хранилища паролей
Чтобы задать параметры посредника паролей, используемого Filament, можно передать имя этого посредника в метод конфигурации authPasswordBroker()
:
use Filament\Panel;
public function panel(Panel $panel): Panel
{
return $panel
// ...
->authPasswordBroker('users');
}
Перевод с английского официальной документации Filament Panel Builder:
https://filamentphp.com/docs/3.x/panels/users
Заберите ссылку на статью к себе, чтобы потом легко её найти!
Раз уж досюда дочитали, то может может есть желание рассказать об этом месте своим друзьям, знакомым и просто мимо проходящим?
Не надо себя сдерживать! ;)