Laravel Spatie/Permission 多租户过滤器
Laravel Spatie/Permission filter for multi-tenant
我有3个主要模型:
- 用户
- 分支机构
- 对象
每个用户都属于一个Branch
,一个Branch
会有很多Users
。
Objects
也将属于 Users
和 Branch
,因此 Objects
有一个 user_id
和一个 branch_id
像这样:
//Objects DB table tructure
[
"id",
"name",
"branch_id",
"user_id",
"created_at",
"updated_at",
]
这是我当前的设置:
Models/Branch.php
public function users()
{
return $this->hasMany(User::class);
}
Models/Users.php
public function branch()
{
return $this->belongsTo(Branch::class);
}
Models/Objects.php
public function user()
{
return $this->belongsTo(User::class);
}
现在我已经设置 Spatie/Permission 具有以下 Roles
:
Super-Admin
:将看到每个 Branch
中的每个 Objects
Admin
:将看到每个 Objects
自己的 Branch
而不是来自其他 Branches
User
: 会看到每一个 Objects
他在他自己的 Branch
中或其他 中创建的而不是任何其他的
我现在的意思是根据用户权限列出所有 Objects
。
我的第一个想法是基于模型建立关系,但我不确定这是一个好主意和实践,这是代码:
public function objects(){
$user = auth()->user();
if ($user->hasRole("Super-Admin")) {
return Object::query();
}
if ($user->hasRole("Admin")) {
return Object::where('branch_id', '=', $user->branch()->pluck('id'));
}
return $this->hasMany(Object::class);
}
这有意义吗?我应该使用其他更合适的 Laravel functionalities/API?
您使用的方法确实有道理,我唯一关心的是在模型的函数内使用经过身份验证的用户。
这可能会导致相同的冲突,例如,如果超级管理员想要查看普通用户的对象,那么此功能对您来说就没有用,因为您总是要检索超级用户的对象-管理员。
我会按如下方式使用你的函数
public function objects(){
if ($this->hasRole("Super-Admin")) {
return Object::query();
}
if ($this->hasRole("Admin")) {
return Object::where('branch_id', '=', $this->branch()->pluck('id'));
}
return $this->hasMany(Object::class);
}
然后在控制器上使用
$user->objects();
您正在检索您在给定时间拥有的用户对象的对象
我有3个主要模型:
- 用户
- 分支机构
- 对象
每个用户都属于一个Branch
,一个Branch
会有很多Users
。
Objects
也将属于 Users
和 Branch
,因此 Objects
有一个 user_id
和一个 branch_id
像这样:
//Objects DB table tructure
[
"id",
"name",
"branch_id",
"user_id",
"created_at",
"updated_at",
]
这是我当前的设置:
Models/Branch.php
public function users()
{
return $this->hasMany(User::class);
}
Models/Users.php
public function branch()
{
return $this->belongsTo(Branch::class);
}
Models/Objects.php
public function user()
{
return $this->belongsTo(User::class);
}
现在我已经设置 Spatie/Permission 具有以下 Roles
:
Super-Admin
:将看到每个Branch
中的每个 Admin
:将看到每个Objects
自己的Branch
而不是来自其他Branches
User
: 会看到每一个Objects
他在他自己的Branch
中或其他 中创建的而不是任何其他的
Objects
我现在的意思是根据用户权限列出所有 Objects
。
我的第一个想法是基于模型建立关系,但我不确定这是一个好主意和实践,这是代码:
public function objects(){
$user = auth()->user();
if ($user->hasRole("Super-Admin")) {
return Object::query();
}
if ($user->hasRole("Admin")) {
return Object::where('branch_id', '=', $user->branch()->pluck('id'));
}
return $this->hasMany(Object::class);
}
这有意义吗?我应该使用其他更合适的 Laravel functionalities/API?
您使用的方法确实有道理,我唯一关心的是在模型的函数内使用经过身份验证的用户。
这可能会导致相同的冲突,例如,如果超级管理员想要查看普通用户的对象,那么此功能对您来说就没有用,因为您总是要检索超级用户的对象-管理员。
我会按如下方式使用你的函数
public function objects(){
if ($this->hasRole("Super-Admin")) {
return Object::query();
}
if ($this->hasRole("Admin")) {
return Object::where('branch_id', '=', $this->branch()->pluck('id'));
}
return $this->hasMany(Object::class);
}
然后在控制器上使用
$user->objects();
您正在检索您在给定时间拥有的用户对象的对象