phpsa/filament-authentication

为 Filament Admin 的用户和角色(通过 Spatie Roles/Permissions)管理资源

v5.0.0-rc.1 2024-09-11 22:50 UTC

README

Latest Version on Packagist Semantic Release Total Downloads

Filament 用户身份验证

使用 Spatie 的角色和权限为 Filament Admin 提供用户资源

包安装

您可以通过 composer 安装此包

composer require phpsa/filament-authentication

并运行安装命令

php artisan filament-authentication:install

这将发布配置文件和迁移文件

可选地发布视图/翻译

artisan vendor:publish --tag=filament-authentication-views
artisan vendor:publish --tag=filament-authentication-translations

Spatie 角色 & 权限

如果您尚未配置此包,它将由安装器自动添加,请执行以下步骤

  1. 您应该使用以下命令发布迁移和 config/permission.php 配置文件
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
php artisan migrate
  1. Spatie\Permission\Traits\HasRoles 特性添加到您的 Users 模型中

  2. 添加所需的角色和权限

更多详情请见:https://spatie.be/docs/laravel-permission/v6/introduction

设置 & 配置

在您的 Filament 控板文件中,您需要在插件部分添加以下内容

添加资源

 public function panel(Panel $panel): Panel
    {
        return $panel
            ...
            ->plugins([
                \Phpsa\FilamentAuthentication\FilamentAuthentication::make(),
            ])
            ...

您可以通过配置文件或插件进行配置

功能

1. 小部件

LatestUsersWidget 可以通过将其添加到您的面板小部件区域添加到您的仪表板中。

 LatestUsersWidget::class

注意,如果存在策略,它也附加到 UserPolicy::viewAny 策略值

2. Laravel Impersonate

如果您尚未配置此包,它将由安装器自动添加,请执行以下步骤

  1. 将特性 Lab404\Impersonate\Models\Impersonate 添加到您的 User 模型中。
  2. 编辑配置文件,将 impersonate->enabled 设置为 true

定义模拟授权

默认情况下,所有用户都可以 模拟 用户。您需要将方法 canImpersonate() 添加到您的用户模型中

    /**
     * @return bool
     */
    public function canImpersonate()
    {
        // For example
        return $this->is_admin == 1;
    }

默认情况下,所有用户都可以 被模拟。您需要将方法 canBeImpersonated() 添加到您的用户模型中以扩展此行为

    /**
     * @return bool
     */
    public function canBeImpersonated()
    {
        // For example
        return $this->can_be_impersonated == 1;
    }

防止模拟

您可以使用中间件 impersonate.protect 来防止您的路由受到用户模拟的影响。此中间件在您想要保护特定页面(如用户订阅、用户信用卡等)时非常有用。

Router::get('/my-credit-card', function() {
    echo "Can't be accessed by an impersonator";
})->middleware('impersonate.protect');

事件 有两个可用的事件可用于改进您的流程

  • TakeImpersonation 在模拟时触发。
  • LeaveImpersonation 在离开模拟时触发。

每个事件都返回两个属性 $event->impersonator$event->impersonated,它们包含 User 模型实例。

3. 密码更新

从 V4.2.0 版本引入 - 这允许您强制用户每 X 天更改一次密码。

启用此功能并按以下方式进行配置

  1. Phpsa\FilamentAuthentication\Traits\CanRenewPassword 特性添加到您的用户模型中
  2. 在配置文件中配置修剪和更新周期选项
  3. 如果未发布,请发布迁移 artisan vendor:publish --tag filament-authentication-migrations

这将强制用户更新密码,请注意 - 所有现有用户最初都将被强制更新,这可以通过运行以下命令来忽略

身份验证日志

自 V4.2.0 版本引入 - 此功能允许您记录每个用户登录尝试。

启用此功能并按以下方式配置

  1. Phpsa\FilamentAuthentication\Traits\LogsAuthentication 特性添加到您的用户模型中
  2. 在配置文件中配置 authentication_log 部分的修剪选项
  3. 可选地,在配置文件的导航部分启用该资源。
  4. 如果未发布,请发布迁移 artisan vendor:publish --tag filament-authentication-migrations

这将记录系统上的登录和注销操作。

安全

可以使用 Laravel 策略保护角色和权限,创建您的策略并在 AuthServiceProvider 中注册它们

 protected $policies = [
        Role::class       => RolePolicy::class,
        Permission::class => PermissionPolicy::class,
        CustomPage::class => CustomPagePolicy::class,
        SettingsPage::class => SettingsPagePolicy::class
        // 'App\Models\Model' => 'App\Policies\ModelPolicy',
    ];

我们有一个自定义页面特性:Phpsa\FilamentAuthentication\Traits\PagePolicyTrait 和一个 Spatie 设置页面特性 Phpsa\FilamentAuthentication\Traits\SettingsPage\PolicyTrait,您可以将它们添加到页面/设置页面中。通过定义一个模型并将其与 viewAny($user) 方法关联,您可以定义每个策略是否在导航中显示页面。

事件

Phpsa\FilamentAuthentication\Events\UserCreated 在通过资源创建用户时触发

Phpsa\FilamentAuthentication\Events\UserUpdated 在通过资源更新用户时触发

未来计划

  • MFA 身份验证
  • Socialite 身份验证
  • 生物识别身份验证

变更日志

请参阅 变更日志 了解最近更改的详细信息。

鸣谢

许可证

MIT 许可证 (MIT)。请参阅 许可证文件 了解更多信息。