You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FilamentPHP多面板下Admin与Owner共享User资源求助

实现Admin与Owner共享User资源并基于角色控制权限的方案

1. 注册共享User资源到两个面板

在Admin和Owner的面板配置文件中,直接注册同一个User资源,无需重复创建:

// App\Filament\AdminPanelProvider.php
public function panel(Panel $panel): Panel
{
    return $panel
        // 其他面板配置(如路由、登录页等)
        ->resources([
            App\Filament\Resources\UserResource::class,
            // 其他Admin专属资源
        ]);
}

// App\Filament\OwnerPanelProvider.php
public function panel(Panel $panel): Panel
{
    return $panel
        // 其他面板配置
        ->resources([
            App\Filament\Resources\UserResource::class,
            // 其他Owner专属资源
        ]);
}

2. 创建User模型策略

生成User策略文件:

php artisan make:policy UserPolicy --model=User

在策略中针对Admin/Owner角色定义权限规则(示例逻辑可根据实际业务调整):

namespace App\Policies;

use App\Models\User;

class UserPolicy
{
    // 查看所有用户:仅Admin允许
    public function viewAny(User $user): bool
    {
        return $user->role === 'admin';
    }

    // 查看单个用户:Admin可查看所有,Owner仅能查看自身及下属用户
    public function view(User $user, User $model): bool
    {
        if ($user->role === 'admin') {
            return true;
        }
        return $user->role === 'owner' && ($model->id === $user->id || $model->owner_id === $user->id);
    }

    // 创建用户:仅Admin允许
    public function create(User $user): bool
    {
        return $user->role === 'admin';
    }

    // 更新用户:Admin可更新所有,Owner仅能更新自身及下属用户
    public function update(User $user, User $model): bool
    {
        if ($user->role === 'admin') {
            return true;
        }
        return $user->role === 'owner' && ($model->id === $user->id || $model->owner_id === $user->id);
    }

    // 删除用户:仅Admin允许
    public function delete(User $user, User $model): bool
    {
        return $user->role === 'admin';
    }
}

3. 在Filament资源中关联策略

在UserResource中指定使用上述策略,Filament会自动继承策略的权限控制逻辑:

namespace App\Filament\Resources;

use App\Models\User;
use App\Policies\UserPolicy;
use Filament\Resources\Resource;

class UserResource extends Resource
{
    protected static ?string $model = User::class;
    protected static ?string $policy = UserPolicy::class; // 关联策略

    // 其他资源配置(列表、表单、详情页等)
}

4. 动态调整面板显示(可选)

如果需要在不同面板中展示不同字段或操作,可通过判断当前面板ID实现动态配置:

// 在UserResource的ListUsers页面中
public function getTableColumns(): array
{
    $panelId = $this->getCurrentPanel()->getId();
    
    if ($panelId === 'admin') {
        return [
            Tables\Columns\TextColumn::make('name'),
            Tables\Columns\TextColumn::make('email'),
            Tables\Columns\TextColumn::make('role'),
            Tables\Columns\TextColumn::make('owner.name')->label('所属Owner'),
        ];
    }
    
    return [
        Tables\Columns\TextColumn::make('name'),
        Tables\Columns\TextColumn::make('email'),
        Tables\Columns\TextColumn::make('role'),
    ];
}

通过以上步骤,即可实现同一个User资源在Admin和Owner面板共享,同时基于策略完成角色权限控制,全程无需重复代码或资源。

内容的提问来源于stack exchange,提问作者user22070755

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 19:12:32