我在这里问一个关于我的某些用户/角色数据库表的设计是否可以接受的问题,但经过一些研究我发现了这个问题:
What is the best way to handle multiple permission types?
这听起来像是一种创新的方法,因此我将多个权限定义为单个小数(我假定为int数据类型),而不是多对多关系user_to_roles表。这意味着单个用户的所有权限都在一行中。在你阅读其他问题并回答
之前,它可能没有意义我无法理解这一点。有人可以解释转换过程吗?这听起来是“正确的”,但我只是没有得到如何将角色转换为十进制数据之前将其转换为十进制数,以及当它从数据库中传出时如何转换回来。我正在使用Java,但如果你把它删掉,那也很酷。
以下是其他问题被删除的原始答案:
“就个人而言,我有时使用标记的权限枚举。这样你就可以对枚举的项目使用AND,OR,NOT和XOR按位运算。
[Flags]
public enum Permission
{
VIEWUSERS = 1, // 2^0 // 0000 0001
EDITUSERS = 2, // 2^1 // 0000 0010
VIEWPRODUCTS = 4, // 2^2 // 0000 0100
EDITPRODUCTS = 8, // 2^3 // 0000 1000
VIEWCLIENTS = 16, // 2^4 // 0001 0000
EDITCLIENTS = 32, // 2^5 // 0010 0000
DELETECLIENTS = 64, // 2^6 // 0100 0000
}
然后,您可以使用AND按位运算符组合多个权限。
例如,如果用户可以查看&编辑用户,操作的二进制结果是0000 0011,转换为十进制为3。 然后,您可以将一个用户的权限存储到DataBase的单个列中(在我们的示例中,它将为3)。
在您的应用程序中,您只需要另一个按位操作(OR)来验证用户是否具有特定权限。“
答案 0 :(得分:4)
您使用按位运算。伪代码类似于:
bool HasPermission(User user, Permission permission) {
return (user.Permission & permission) != 0;
}
void SetPermission(User user, Permission permission) {
user.Permission |= permission;
}
void ClearPermission(User user, Permission permission) {
user.Permission &= ~permission;
}
权限是你帖子中定义的枚举类型,不管它需要基于类似整数的类型。这同样适用于User.Permission字段。
如果那些运算符(&,| =和& =)对你没有意义,那么就读取按位运算(按位AND和按位OR)。
答案 1 :(得分:3)
实际上,这就是我们如何在一个相当大的Web应用程序中确定我是DBA的权限。
如果您打算做这样的事情,那么拥有numbers table你真的会受益匪浅。它会使你的计算更快。
基本设置包括以下表格:
首先我们确定用户是否已登录。如果不是,我们将返回安全点的匿名授权。
接下来,我们通过使用EXISTS
的简单JOIN
来确定用户是否是与安全点相关联的任何组的成员。如果不是,我们返回与经过身份验证的用户关联的值。在我们的系统上,大多数匿名和经过身份验证的默认值都设置为1,因为我们要求您属于特定组。
注意:如果匿名用户无法访问,则界面会将其转到登录框,以允许他们登录并重试。
如果用户是一个或多个组的成员,那么我们从BitMask表中为组定义的每个值选择不同的值。例如,如果您属于三个组,其中一个授权级别为8,一个为12,最后一个为36,则我们对Bit Mask表的选择将分别返回8,8和4,以及4和32。通过做一个截然不同的我们得到数字4,8和32,正确位掩码为101100。
该值将作为用户授权级别返回并由网站处理。
有意义吗?