适用于多租户的Laravel Spatie / Permission过滤器

时间:2019-02-15 12:15:40

标签: php laravel 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);
}

现在,我使用以下Roles设置了Spatie/Permission

  • Super-Admin:将看到每个Objects的每个Branch
  • 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功能/ API?

1 个答案:

答案 0 :(得分:0)

您使用的方法确实是有道理的,唯一让我担心的是在模型的函数内部使用经过身份验证的用户。

这可能会导致相同的冲突,例如,如果超级管理员想要查看普通用户的对象,则此功能对您没有好处,因为您一直在检索超级管理员的对象。

我将按照以下方式使用您的函数

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();

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