【问题标题】:Laravel Spatie/Permission filter for multi-tenant用于多租户的 Laravel Spatie/权限过滤器
【发布时间】:2019-02-16 04:07:56
【问题描述】:

我有 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",
]

这是我目前的设置:

模型/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:将看到每个Objects 的每个Branch
  • Admin:将看到它自己的每个Objects Branch,而不是来自其他 Branches
  • User:将看到他在自己的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 功能/API 吗?

【问题讨论】:

    标签: php laravel multi-tenant


    【解决方案1】:

    您使用的方法确实有意义,我唯一关心的是在模型的函数中使用经过身份验证的用户。

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

    我会使用你的功能如下

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

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

    【讨论】:

    • 这太聪明了!谢谢!
    猜你喜欢
    • 2020-07-02
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 2021-12-20
    • 2019-09-19
    • 2023-03-25
    相关资源
    最近更新 更多