概览
简介
默认情况下,所有 App\Models\User 都可以在本地访问 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() 方法根据用户是否被允许访问 $panel 返回 true 或 false。本例中,我们检查用户邮箱是否以 @yourdomain.com 结尾,以及是否已验证邮箱。
由于你能访问当前的 $panel,可以为不同面板编写条件检查。例如,仅限制 admin 面板的访问,同时允许所有用户访问应用的其他面板:
<?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 属性,则会优先使用它。若要自定义 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 换成其他服务,只需创建一个新的头像提供方。
本例中,我们为 boringavatars.com 在 app/Filament/AvatarProviders/BoringAvatarsProvider.php 创建新文件。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 还支持多因素认证,详见 多因素认证 一节。
自定义认证功能
若要用自己的页面替换这些页面,可以向这些方法传入任意 Filament 页面类。
大多数人可以通过扩展 Filament 代码库中的基础页面类、重写如 form() 等方法,再把新页面类传入配置来完成所需自定义:
use App\Filament\Pages\Auth\EditProfile;
use Filament\Panel;
public function panel(Panel $panel): Panel
{
return $panel
// ...
->profile(EditProfile::class);
}本例中,我们将自定义个人资料页。需要在 app/Filament/Pages/Auth/EditProfile.php 创建新的 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() 等方法以获取页面的默认表单组件。你可按需自定义这些组件。所有可用的自定义选项,请参阅 Filament 代码库中的基础 EditProfile 页面类——其中包含所有可重写以进行更改的方法。
无需重新定义表单即可自定义认证字段
若想自定义认证表单中的某个字段,而不必定义新的 form() 方法,可以扩展对应的字段方法并链式调用你的自定义:
use Filament\Schemas\Components\Component;
protected function getPasswordFormComponent(): Component
{
return parent::getPasswordFormComponent()
->revealable(false);
}邮箱变更验证
若同时使用 profile() 与 emailChangeVerification() 功能,用户从个人资料表单更改邮箱后,必须验证新邮箱才能用其登录。系统会向新地址发送验证邮件,其中包含用户必须点击的链接以验证新邮箱。在用户点击邮件中的链接之前,数据库中的邮箱地址不会更新。
发给用户的链接有效期为 60 分钟。向新地址发送邮件的同时,也会向旧地址发送一封邮件,其中包含阻止此次变更的链接。这是一项安全功能,有助于防止用户受到恶意行为者的影响。
在个人资料页使用侧栏
默认情况下,个人资料页不使用带侧栏的标准页面布局。这样是为了兼容 多租户 功能;否则,若用户没有租户,侧栏链接会路由到当前租户,导致该页无法访问。
若面板未使用 多租户,且希望个人资料页使用带侧栏的标准布局,可在注册页面时向 $panel->profile() 传入 isSimple: false 参数:
use Filament\Panel;
public function panel(Panel $panel): Panel
{
return $panel
// ...
->profile(isSimple: false);
}自定义认证路由 slug
你可以在 配置 中自定义认证路由使用的 URL slug:
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');
}设置认证守卫
要设置 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');
}禁用可显示密码输入
默认情况下,认证表单中的所有密码输入都是 revealable()。用户点击按钮即可看到正在输入的明文密码。若要禁用此功能,可将 false 传给 revealablePasswords() 配置 方法:
use Filament\Panel;
public function panel(Panel $panel): Panel
{
return $panel
// ...
->revealablePasswords(false);
}也可以在 扩展基础页面类 时,对字段对象调用 ->revealable(false),按字段禁用该功能。
设置访客访问面板
默认情况下,Filament 假定只面向已认证用户。若要允许访客访问面板,需要避免使用期望已登录用户的组件(如个人资料、头像),并移除内置的 Authentication 中间件:
- 从面板配置的 `authMiddleware()` 数组中移除默认的 `Authenticate::class`。
- 从面板中移除 `->login()` 以及任何其他 [认证功能](#authentication-features)。
- 从 `widgets()` 数组中移除默认的 `AccountWidget`,因为它会读取当前用户数据。
在策略中授权访客
存在时,Filament 依赖 Laravel 模型策略 进行访问控制。若要在 模型策略中为访客用户 授予读取权限,请创建 Policy,并更新 viewAny() 与 view() 方法:将 User $user 参数改为可选的 ?User $user,并 return true;。或者,也可以直接从策略中完全移除这些方法。