跳到主要内容
版本:3.0

用户

概述

默认情况下,所有的 App\Models\User 用户可以在本地环境中访问 Filament。但如果要在生产环境中同样允许用户访问,需要一些额外的操作来确保授权的用户才能访问面板。

授权访问面板

要让非本地环境的 App\Models\User 用户获取访问权限,你需要实现 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 以及用户是否验证过该邮箱。

设置头像

Filament 使用可开箱即用的ui-avatars.com 生成基于用户名的头像。你也可以实现 HasAvatar 合约接口,自定义用户头像 URL:

<?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

使用其他头像 Provider

你可以创建一个新的头像 Provider 将 ui-avatars.com 替换成不同的服务.

本例中,我们为 boringavatars.com 创建了一个新文件 app/Filament/AvatarProviders/BoringAvatarsProvider.phpget() 方法接收一个用户模型实例并返回该用户的头像 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);
}
}

现在,在配置文件中注册该 Provider:

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

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

配置用户 name 属性

默认情况下,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);
}

本例中,我们将自定义 Profile 页面。我们需要创建一个新的 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 代码库的基础 Profile 页面类。其他你需要继承的页面包括:

  • 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 以获取页面的默认表单组件。你可以按需求自定义这些组件。所有可控的自定义选项,请查看 Filament 代码库中的基础 EditProfile 页面类 —— 它包含你可以重写修改的所有方法。

身份验证保护

要设置 Filament 使用的 Authentication Guard,你可以将 guard 名传入到 authGuard() 配置方法中:

use Filament\Panel;

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

设置密码 Broker

要设置 Filament 使用的 Password Broker,你可以将 broker 名传入到 authPasswordBroker() 配置方法中:

use Filament\Panel;

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