Skip to content
全部文档

概览

简介

默认情况下,所有 App\Models\User 都可以在本地访问 Filament。若要在生产环境中允许访问,你必须再做几步,确保只有正确的用户能进入应用。

默认登录页默认登录页

授权访问面板

要让 App\Models\User 能在非本地环境访问 Filament,你必须实现 FilamentUser 契约:

php
<?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 返回 truefalse。本例中,我们检查用户邮箱是否以 @yourdomain.com 结尾,以及是否已验证邮箱。

由于你能访问当前的 $panel,可以为不同面板编写条件检查。例如,仅限制 admin 面板的访问,同时允许所有用户访问应用的其他面板:

php
<?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
<?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.comapp/Filament/AvatarProviders/BoringAvatarsProvider.php 创建新文件。get() 方法接收用户模型实例,并返回该用户的头像 URL:

php
<?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);
    }
}

然后,在 配置 中注册这个新的头像提供方:

php
use App\Filament\AvatarProviders\BoringAvatarsProvider;
use Filament\Panel;

public function panel(Panel $panel): Panel
{
    return $panel
        // ...
        ->defaultAvatarProvider(BoringAvatarsProvider::class);
}

配置用户姓名属性

默认情况下,Filament 会使用用户的 name 属性在应用中显示姓名。若要更改,可以实现 HasName 契约:

php
<?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() 方法用于获取当前用户的姓名。

认证功能

你可以在配置文件中轻松为面板启用认证功能:

php
use Filament\Panel;

public function panel(Panel $panel): Panel
{
    return $panel
        // ...
        ->login()
        ->registration()
        ->passwordReset()
        ->emailVerification()
        ->emailChangeVerification()
        ->profile();
}
默认注册页默认注册页
默认密码重置页默认密码重置页
默认个人资料页默认个人资料页

Filament 还支持多因素认证,详见 多因素认证 一节。

自定义认证功能

若要用自己的页面替换这些页面,可以向这些方法传入任意 Filament 页面类。

大多数人可以通过扩展 Filament 代码库中的基础页面类、重写如 form() 等方法,再把新页面类传入配置来完成所需自定义:

php
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
<?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\Login
  • Filament\Auth\Pages\Register
  • Filament\Auth\Pages\EmailVerification\EmailVerificationPrompt
  • Filament\Auth\Pages\PasswordReset\RequestPasswordReset
  • Filament\Auth\Pages\PasswordReset\ResetPassword

在示例的 form() 方法中,我们调用如 getNameFormComponent() 等方法以获取页面的默认表单组件。你可按需自定义这些组件。所有可用的自定义选项,请参阅 Filament 代码库中的基础 EditProfile 页面类——其中包含所有可重写以进行更改的方法。

无需重新定义表单即可自定义认证字段

若想自定义认证表单中的某个字段,而不必定义新的 form() 方法,可以扩展对应的字段方法并链式调用你的自定义:

php
use Filament\Schemas\Components\Component;

protected function getPasswordFormComponent(): Component
{
    return parent::getPasswordFormComponent()
        ->revealable(false);
}

邮箱变更验证

若同时使用 profile()emailChangeVerification() 功能,用户从个人资料表单更改邮箱后,必须验证新邮箱才能用其登录。系统会向新地址发送验证邮件,其中包含用户必须点击的链接以验证新邮箱。在用户点击邮件中的链接之前,数据库中的邮箱地址不会更新。

发给用户的链接有效期为 60 分钟。向新地址发送邮件的同时,也会向旧地址发送一封邮件,其中包含阻止此次变更的链接。这是一项安全功能,有助于防止用户受到恶意行为者的影响。

在个人资料页使用侧栏

默认情况下,个人资料页不使用带侧栏的标准页面布局。这样是为了兼容 多租户 功能;否则,若用户没有租户,侧栏链接会路由到当前租户,导致该页无法访问。

若面板未使用 多租户,且希望个人资料页使用带侧栏的标准布局,可在注册页面时向 $panel->profile() 传入 isSimple: false 参数:

php
use Filament\Panel;

public function panel(Panel $panel): Panel
{
    return $panel
        // ...
        ->profile(isSimple: false);
}

自定义认证路由 slug

你可以在 配置 中自定义认证路由使用的 URL slug:

php
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() 配置 方法:

php
use Filament\Panel;

public function panel(Panel $panel): Panel
{
    return $panel
        // ...
        ->authGuard('web');
}

设置密码代理

要设置 Filament 使用的密码代理,可将代理名称传给 authPasswordBroker() 配置 方法:

php
use Filament\Panel;

public function panel(Panel $panel): Panel
{
    return $panel
        // ...
        ->authPasswordBroker('users');
}

禁用可显示密码输入

默认情况下,认证表单中的所有密码输入都是 revealable()。用户点击按钮即可看到正在输入的明文密码。若要禁用此功能,可将 false 传给 revealablePasswords() 配置 方法:

php
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;。或者,也可以直接从策略中完全移除这些方法。