默认情况下,所有 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。 在这个例子中,我们会检查用户的电子邮件是否以 @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 属性,则会使用该属性。要自定义 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](https://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);
}在此示例中,我们将自定义个人资料页面。我们需要在 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\认证\页面\登录Filament\认证\页面\注册Filament\认证\页面\密码重置\重置密码在示例的 form() 方法中,我们调用了诸如 getNameFormComponent() 等方法来获取页面默认的表单组件。你可以根据需要自定义这些组件。有关所有可用的自定义选项,请参阅 Filament 代码库中的基础 EditProfile 页面类 — 它包含了所有可供你重写以进行更改的方法。
如果您想自定义认证表单中的某个字段,而无需定义新的 form() 方法,您可以扩展特定的字段方法并链式调用您的自定义项:
use Filament\Schemas\Components\Component;
protected function getPasswordFormComponent(): Component
{
return parent::getPasswordFormComponent()
->revealable(false);
}如果您将 profile() 功能与 emailChangeVerification() 功能配合使用,则从个人资料表单更改电子邮件地址的用户需要验证其新电子邮件地址才能使用它登录。 这是通过向新地址发送一封验证电子邮件来完成的,该电子邮件包含一个用户必须点击才能验证其新电子邮件地址的链接。 数据库中的电子邮件地址在用户点击电子邮件中的链接之前不会更新。
用户收到的链接有效期为 60 分钟。在向新地址发送邮件的同时,也会向旧地址发送一封邮件,其中包含一个用于阻止更改的链接。这是一项安全功能,旨在潜在地防止用户受到恶意行为者的影响。
默认情况下,个人资料页面不使用带侧边栏的标准页面布局。这样做是为了使其与 tenancy 功能配合使用,否则,如果用户没有租户,该页面将无法访问,因为侧边栏链接会路由到当前租户。
如果您在面板中没有使用多租户,并且您希望个人资料页面使用带有侧边栏的标准页面布局,您可以在注册页面时将 isSimple: false 参数传递给 $panel->profile():
use Filament\Panel;
public function panel(Panel $panel): Panel
{
return $panel
// ...
->profile(isSimple: false);
}你可以在配置中自定义用于身份验证路由的 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() 以及任何其他 身份验证功能 从面板中。AccountWidget 从 widgets() 数组中,因为它读取当前用户的数据。存在时,Filament 依赖 Laravel 模型策略 进行访问控制。为了给予 模型策略中的访客用户 读访问权限,请创建策略并更新 viewAny() 和 view() 方法,将 User $user 参数更改为 ?User $user 以使其成为可选,并 return true;。或者,您可以完全从策略中删除这些方法。