如何解决通过user_id的Lighthouse GraphQL数据所有权
我有一个允许多个用户的应用程序。每个用户都是彼此完全隔离的;这意味着不是数据库用户的所有内容都有一个export const customArray = createSelector(
arrayCustomizations,(entities: Dictionary<Customizations>,props: { id: string }) => {
const customizations = entities[props.id];
return customizations.allCustoms;
},).pipe(
filter(object => object.name !== null)
);
列,并且只允许登录用户查看,更新或删除它们。此外,用户无法使用其他人的user_id创建行。
是否有内置方法可通过流明/灯塔解决此问题?这是我已经完成的工作,并且可以运行,但是我想知道是否重新发明了轮子:
- 每个模型都具有
user_id
关系,如下所示:
user
- 我为这些模型添加了
public function user(): BelongsTo { return $this->belongsTo(User::class); }
,内容如下:
HasOwnerTrait
- 最后,在我的架构定义中:
public static function boot()
{
parent::boot();
static::creating(function (Model $model) {
$model->user_id = Auth::user()->id;
});
static::saving(function (Model $model) {
if ($model->user_id !== Auth::user()->id) {
$exception = new ModelNotFoundException();
$exception->setModel(self::class,$model->id);
throw $exception;
}
});
static::deleting(function (Model $model) {
if ($model->user_id !== Auth::user()->id) {
$exception = new ModelNotFoundException();
$exception->setModel(self::class,$model->id);
throw $exception;
}
});
}
public function scopeIsOwner($query)
{
return $query->where('user_id',Auth::user()->id);
}
再次,这是可行的,但是是否需要像这样临时进行,还是有更好的方法?
解决方法
我认为您的解决方案很好,这样可以节省编写一堆样板的工作。一些小建议:
通过将boot
方法重命名为bootHasOwnerTrait
,可以使您的特征成为可引导特征,框架会自动调用该特征。
默认情况下,可以考虑使isOwner
范围处于活动状态。在Laravel中,这令人困惑地称为 global scope 。这允许您省略显式命名范围,尽管如果您有一些查询不适用于该范围,例如仍然可以忽略它。统计信息。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。