Laravel/Filament 中每个租户的角色/权限

问题描述 投票:0回答:1

我正在 Filament 中开发多租户应用程序,并正在努力解决数据库设计问题。

我所做的是,每个用户属于许多租户(在我的例子中是单元),并且每个租户可以拥有多个用户。

创建帐户时,每个用户还会创建一个租户(单元),除非被邀请(通过仪表板)加入已创建的单元。

我想做的是引入角色和权限,以便每个用户获得“所有者”角色 创建租户后,受邀用户应具有“读者”角色。

这意味着每个用户都将拥有与租户(单元)关联的角色。 我正在寻找一个简单的解决方案。

这是目前的情况,我不知道这是否是最好的解决方案。

单位用户
用户ID
单位id
角色_id
角色
id
名字
描述

现在获取当前角色:

public function currentUnitRole()
{
        return $this->units()
            ->where('id', Filament::getTenant()->id)
            ->with('pivot.role') // Eager load the role relationship
            ->first()
            ->pivot
            ->role;
}

有更好的方法吗?

php laravel database filamentphp
1个回答
0
投票

使用 Filament 处理多租户应用程序时,用户和租户之间的连接涉及各种角色和权限。根据您的解释,用户似乎在不同的租户中拥有不同的角色。要管理这些连接,您必须设置一个中间表。

考虑以下数据库结构和方法:

  1. 数据库结构:
  • users
    :存储用户信息。
  • units
    :存储租户信息。
  • roles
    :存储角色信息(如所有者、读者等)。
  • unit_user
    :用于存储关系的中间表(数据透视表),还包含 role_id 字段。
  1. 数据透视表 (

    unit_user
    ):

    • user_id
    • unit_id
    • role_id
      :引用
      id
      表中的
      roles
      的外键,以确定用户在单位内的角色。
  2. 雄辩的模型关系:

  • 一个
    User
    模型,定义
    belongsToMany
    Unit
    的关系,并为
    role
    附加一个枢轴属性。
  • 定义
     relationship
    User
    以及
    pivot
    role
    信息的单位模型。
  • 数据透视表模型,如果您需要为数据透视表定义进一步的逻辑,可能会扩展
    Illuminate\Database\Eloquent\Relations\Pivot

而不是

currentUnitRole
,请考虑 Laravel 功能,该功能允许您在向相关用户查询单元期间直接预加载
role
。利用 Eloquent 的
eager
加载需要额外的实现:

public function currentUnitRole()
{
    $currentUnit = $this->units()
        ->where('id', Filament::getTenant()->id)
        ->with('pivot.role')
        ->first();

    return optional($currentUnit->pivot)->role;
}

这确保了如果没有返回单位,在

->role
上调用
null
不会引发异常。

其他注意事项:

© www.soinside.com 2019 - 2024. All rights reserved.