我在这里问一个关于我的某些用户/角色数据库表的设计是否可以接受的问题,但经过一些研究后我遇到了这个问题:
这听起来像是一种创新方法,因此我将多个权限定义为单个十进制(我假定为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
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用AND按位运算符组合多个权限.
例如,如果用户可以查看和编辑用户,则操作的二进制结果为0000 0011,转换为十进制为3.然后,您可以将一个用户的权限存储到DataBase的单个列中(在我们的示例中,它将是3).
在您的应用程序中,您只需要另一个按位操作(OR)来验证用户是否具有特定权限."
您使用按位运算。伪代码类似于:
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;
}
Run Code Online (Sandbox Code Playgroud)
Permission 是您帖子中定义的枚举类型,尽管它是任何类型都需要基于类似整数的类型。这同样适用于 User.Permission 字段。
如果这些运算符(&、|= 和 &=)对您没有意义,那么请阅读按位运算(按位 AND 和按位 OR)。