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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 22:12:24