【发布时间】:2019-05-03 02:08:54
【问题描述】:
我正在计划一个基于 DB 的系统,该系统将支持分层多租户以及功能和权限的继承。示意图结构如下所示:
[0]
/ \
/ \
[1] [2]
/ / \
/ / \
[11] [21] [22]
/ \ \
/ \ \
[211] [212] [221]
/ \
/ \
[2211] [2212]
此处设置表示层次结构中每个节点的数字只是为了简单起见,不应从中推断出任何内容。
第二个维度将由不同类型的用户给出,每种类型定义一组权限(例如,对系统处理的不同类型对象的访问类型)。
每个用户都将被分配给一个特定的用户类型和一个特定的租户(即上图中的一个节点)。分配给节点的用户将仅具有可见性(如果分配了所需的权限 到相关的用户类型)到同一租户内的对象以及用户所属的租户下的所有租户。
第三个维度将由可以对分配给用户类型的默认权限进行修改的事实给出。例如,管理员用户类型可以创建新用户,但在子分支 [221](和向下)除外。此异常将被定义为租户 [221] 的“掩码”。
因此,每当管理员登录其租户为 [2212] 的系统时,他获得的权限就是以下权限的叠加:
Privileges defined at [2212] overriding the
privileges defined at [221] overriding the
privileges defined at [22] overriding the
privileges defined at [2] overriding the
privileges defined at [0]
例如,假设有 5 种不同的对象类型,分别是 O1、O2、O3、O4 和 O5,权限分别为“N”(无)、“R”(读取)和“W”(读取/写)。默认情况下,管理员用户类型将对所有对象类型拥有“W”权限。
现在,我们在节点 [22] 的对象类型 O3 和 O5 上定义特权“R”,在级别 [221] 的对象类型 O5 上定义“N”特权。因此,分配给节点(租户)[2212] 的管理员将继承以下权限:
Object Type O1 O2 O3 O4 O5
=================================================
From [0] W W W W W
From [2] _ _ _ _ _
From [22] _ _ R _ R
From [221] _ _ _ _ N
From [2212] _ _ _ _ _
------------------------------------------------
Result ===> W W R W N
现在,需要应对三个挑战:
当用户在节点(租户)X登录系统时,需要收集X的所有子节点以识别用户将(潜在)对其具有可见性和操作权的对象,
当用户登录系统时,需要通过向上直到根节点来评估他的权限,
所提出的方法对于 DB 实现 (SQL Server) 是否合理?
在这三个问题中,“1”可以通过使用CTE实现递归来简单解决。然后剩下问题 2 和 3。我应该如何解决这个问题?
【问题讨论】:
标签: sql sql-server inheritance multi-tenant