stechstudio/filament-impersonate

一个用于模拟用户行为的 Filament 扩展包。

3.14 2024-08-27 12:29 UTC

README

Latest Version on Packagist Software License

这是一个为 Filament 开发的插件,使得模拟用户行为变得简单。

致谢

此包底层使用 https://github.com/404labfr/laravel-impersonate,并大量借鉴了 https://github.com/KABBOUCHI/nova-impersonate

安装

按照常规操作

composer require stechstudio/filament-impersonate

快速开始

1. 添加表格操作

首先打开你希望添加模拟操作的资源页面。这通常是你的 UserResource 类。

找到 table 方法。在定义完表格列后,你可以通过 actions 方法为表格添加 Impersonate 作为新的操作。你的类应该看起来像这样

namespace App\Filament\Resources;

use Filament\Resources\Resource;
use STS\FilamentImpersonate\Tables\Actions\Impersonate;

class UserResource extends Resource {
    public static function table(Table $table)
    {
        return $table
            ->columns([
                // ...
            ])
            ->actions([
                Impersonate::make(), // <--- 
            ]);
    }

你还可以为操作定义 guardredirectTo

Impersonate::make('impersonate')
    ->guard('another-guard')
    ->redirectTo(route('some.other.route'));

2. 添加页面操作

现在打开你希望按钮出现的页面,这通常是 EditUser;

转到 getActions 方法,并在这里添加 Impersonate 页面操作。

<?php
namespace App\Filament\Resources\UserResource\Pages;

use App\Filament\Resources\UserResource;
use Filament\Resources\Pages\EditRecord;
use STS\FilamentImpersonate\Pages\Actions\Impersonate;

class EditUser extends EditRecord
{
    protected static string $resource = UserResource::class;

    protected function getActions(): array
    {
        return [
            Impersonate::make()->record($this->getRecord()) // <--
        ];
    }
}

注意:你必须传递记录,就像这个例子一样!

3. 在 blade 布局中添加横幅

唯一需要做的另一步是在你模拟其他用户时,在你的应用中显示通知。打开你的主布局文件,在 </body> 标签之前添加 <x-impersonate::banner/>

4. 完成收益!

就是这样。现在你应该能在 Filament 的 UserResource 列表中看到每个用户的旁边都有一个操作图标

CleanShot 2022-01-03 at 14 10 36@2x

当你点击模拟图标时,你将登录为该用户,并被重定向到你的主应用。你会在页面顶部看到模拟横幅,并有一个按钮来离开并返回 Filament

banner

配置

所有配置都可以通过 ENV 变量管理,无需直接发布和编辑配置文件。只需查看 配置文件

授权

默认情况下,只有 Filament 管理员可以模拟其他用户。你可以通过在 FilamentUser 类中添加 canImpersonate 方法来控制这一点

class User implements FilamentUser {
    
    public function canImpersonate()
    {
        return true;
    }
    
}

你还可以控制哪些目标可以被模拟。只需在用户类中添加一个 canBeImpersonated 方法,并添加你需要的任何逻辑

class User {

    public function canBeImpersonated()
    {
        // Let's prevent impersonating other users at our own company
        return !Str::endsWith($this->email, '@mycorp.com');
    }
    
}

自定义横幅

Blade 组件有一些你可以自定义的选项。

样式

横幅默认是暗色,你可以将其设置为浅色或自动。

<x-impersonate::banner style='light'/>

显示名称

横幅将显示被模拟的用户名称,假设存在 name 属性。如果需要,你可以自定义它。

<x-impersonate::banner :display='auth()->user()->email'/>