在数据库中保存三个级别的权限


Saving three levels of permissions in database

在涉及两个以上级别的数据库中存储权限的最佳方式是什么?目前只有两个级别的权限,它们存储在如下的桥接实体表中:

UID | Buildings | Floor
------------------------
 1  |  A, B, C  |  F9

还有另一个名为Exceptions的表,它具有相同的结构,表明用户不应该拥有这些权限:

UID | Buildings | Floor
------------------------
 1  |    null   |  C4

因此,在我上面的例子中,用户1将有权访问F楼的9层,A、B和C楼的所有房间,但不能访问C楼的4层。

新的要求是添加更精细的权限级别,即楼层上的房间。所以代码看起来像A1A、A1B等。建筑物和房间总是字母,楼层编号总是数字我无法更改这些代码的格式,因为它们来自外部来源

处理这种情况的最佳方法是什么?我知道Linux用一个位字符串处理组和用户的文件权限,但在我的情况下,有数千个房间,这听起来不可行,而且用户/组只有两个级别。

我考虑过添加一个名为Rooms的新列,然后继续使用逗号分隔的字符串,但有更好的方法吗?如果重要的话,我使用的是MySQL。

如果必须实现这一点,我将使用一个包含三列的表——uid、type和element。Uid引用用户、类型(建筑、楼层、房间)和元素——建筑或楼层或房间的代码。我通常会为每个访问元素为每个人插入一行。

如果我确信元素的格式遵循严格的模式,我也可以变得更加大胆。例如

建筑物的代码只有字母

楼层将有类似letter.number 的代码

房间将有letter.number.letter 等代码

在上面的情况下,您可以只使用一个具有列uid和元素的表,因为根据数据的格式,您可以提取元素的类型(如果是建筑物、楼层或房间)。您还可以更进一步,使用通配符存储访问权限:

进入建筑物C:C*的所有楼层和房间

通往B栋6层所有房间的通道:B6*

甚至

访问所有楼层和建筑物的所有C室:**C

进入所有二楼:*2*

希望它能帮助