【问题标题】:Laravel Api mult-tenant within mult-tenantLaravel Api 多租户内的多租户
【发布时间】:2020-11-27 19:56:19
【问题描述】:

我正在测试 laravel 以替换我拥有的应用程序。

我实现了多租户 (https://tenancy.dev/docs/hyn/5.6),将数据库中的每个租户和通过子域访问的每个租户分开。

这解决了我的部分问题。因为我可以将数据库中的每个业务组分开。但是,在同一个业务组内,可能有多个业务单元。我将举一个 mc donalds 的例子,那将是业务组,每个商店都是单位。为了解决这个问题,我想到了创建一个新的租户机制,这一次,在数据库中用一个tenant_id 分隔。

在这种情况下,我想从最有经验的人那里知道这是否是正确的方法?

出现的另一个问题是同一业务组内的用户访问多个业务部门。在这种情况下,如何允许这种访问,而不必为每个业务部门重新注册?

我希望我已经清楚地解释了这个问题。如果您需要更多信息,请告诉我。

欢迎任何帮助。

提前感谢所有阅读本文的人。

【问题讨论】:

    标签: laravel api rest multi-tenant


    【解决方案1】:

    对于这个问题,你得引入租户层次的概念,例如

    McDonald (Main Tenant)
        McDonald Seattle
        McDonald Oregon
        McDonald Newyork
    

    通过这种方式,您可以让父租户包含所有业务用户,然后将访问权限分配给相应的子租户。如果您有一个用户在多个租户中工作,则允许用户将登录后的租户上下文设置为根租户。这有助于您识别上下文租户并相应地加载数据。

    在许多用例中,子租户可以拥有自己的用户。这也可能伴随着这样的问题,例如我可以将用户从子租户提升为父租户,例如可以管理连锁餐厅的区域经理。

    登录时,您可以检查用户是否登录了单个租户(在层次结构 [父/租户] 中),在这种情况下,您可以允许直接登录,否则提示租户上下文设置页面将他路由到相应的租户。

    在 ACL 的情况下,我们可能必须按租户分配角色和权限(通过一个 tenantId 列就足够了),这有助于用户在一个子租户 (McDonald Seattle) 中扮演经理角色,在 (@987654324) 中扮演销售员角色@) 租户。

    例如,我可以有以下模型。这将在选择租户时设置,从那时起,我将能够使用权限/角色从这个上下文中进行验证,这样就不会再调用数据库等了。这可以在 UI 和 REST 中完成API 层(在 REST API 层中,我们对用户进行身份验证的地方可以设置它,并让 API、服务、BusinessRules 层将其用作事实来源,而不是访问数据库)

    class UserContext {
        String userName,
        Guid Id,
        Guid TenantId,
        Roles[] TenantRoles,
        String[] Permissions
    }
    

    【讨论】:

    • 感谢您的回复。澄清一些疑问非常有用。现在我正在测试包:github.com/solutosoft/laravel-multitenant 我对包做了一些更改。我创建了一个 user_idXtenant_id 表,其中存储了用户有权访问的租户。在记录中进行查询/修改时,我会检查该用户是否有权访问该特定租户。对于您所公开的这一概念,您还有其他建议吗?
    • 如果您选择租户,我会根据租户为用户设置权限,这样对于租户上下文下的每个操作,我都不必查找租户映射。我将在帖子中分享示例代码
    • 感谢回复..我参与了另一个项目,所以之前没有回答。我设法解决了部分他的推理。