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
相关产品推荐
相关产品推荐

