Laravel Spatie/Permission 多租户过滤器

Laravel Spatie/Permission filter for multi-tenant

我有3个主要模型:

每个用户都属于一个Branch,一个Branch会有很多Users

Objects 也将属于 UsersBranch,因此 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:

我现在的意思是根据用户权限列出所有 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();

您正在检索您在给定时间拥有的用户对象的对象