如何在Filament Resource‘POINT’中实现用户数据隔离与管理员全览?
实现Filament Point Resource的用户数据隔离需求
核心思路
不需要依赖Filament Tenancy(它适用于多租户场景),直接在Resource层通过查询过滤+权限判断实现:普通用户仅能查看/操作自己的记录,管理员可访问全部数据。
1. 确认模型关联
确保Point模型包含user_id字段,关联到User模型:
// app/Models/Point.php namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; class Point extends Model { protected $fillable = ['user_id', /* 其他字段 */]; public function user(): BelongsTo { return $this->belongsTo(User::class); } }
2. 在Resource中添加查询过滤
重写PointResource的getEloquentQuery方法,根据用户身份过滤数据:
// app/Filament/Resources/PointResource.php namespace App\Filament\Resources; use App\Models\Point; use Filament\Resources\Resource; use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Facades\Auth; class PointResource extends Resource { // ... 其他默认代码 public static function getEloquentQuery(): Builder { $query = parent::getEloquentQuery(); // 非管理员用户仅能查看自己的记录 if (!Auth::user()->is_admin) { // 这里根据你的权限逻辑调整,比如用Spatie Permission的hasRole('admin') $query->where('user_id', Auth::id()); } return $query; } // ... 其他默认代码 }
3. 自动填充用户ID(创建记录时)
为了确保普通用户创建的记录自动关联自己的ID,在表单中添加隐藏字段:
// 在PointResource的form方法内 use Filament\Forms\Components\Hidden; public static function form(Form $form): Form { return $form ->schema([ Hidden::make('user_id') ->default(fn () => Auth::id()) ->disabled() // 禁止用户修改 ->required(), // 其他表单字段... ]); }
4. 可选:限制操作权限
如果需要禁止普通用户编辑/删除他人记录(虽然查询过滤已经看不到,但可以进一步加固),可以在操作中添加权限判断:
// 在PointResource的table方法内,针对编辑/删除操作 use Filament\Tables\Actions\EditAction; use Filament\Tables\Actions\DeleteAction; public static function table(Table $table): Table { return $table ->columns([ // 表格列... ]) ->actions([ EditAction::make() ->visible(fn (Point $record) => Auth::user()->is_admin || $record->user_id === Auth::id()), DeleteAction::make() ->visible(fn (Point $record) => Auth::user()->is_admin || $record->user_id === Auth::id()), ]); }
权限逻辑调整提示
如果你的项目使用了Spatie Laravel Permission这类权限包,只需将!Auth::user()->is_admin替换为!Auth::user()->hasRole('admin')即可适配角色系统。
内容的提问来源于stack exchange,提问作者Sylvester Aladejana
相关产品推荐
相关产品推荐

