database - 多种权限类型(角色)以十进制形式存储在数据库中

标签 database permissions roles

我本来想在这里问一个问题,关于我对某些用户/角色数据库表的设计是否可以接受,但经过一番研究后,我遇到了这个问题:

What is the best way to handle multiple permission types?

这听起来像是一种创新方法,因此我没有将多对多关系 users_to_roles 表定义为单个小数(我认为是 int 数据类型)。这意味着单个用户的所有权限都在一行中。在您阅读其他问题和答案之前,它可能没有意义

我无法理解这个问题。有人可以解释转换过程吗?这听起来“正确”,但我只是不知道如何在角色进入数据库之前将其转换为小数,以及当它从数据库中出来时如何转换回来。我正在使用 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。 然后,您可以将一个用户的权限存储到数据库的单个列中(在我们的例子中为 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;
}

权限是在您的帖子中定义的枚举类型,但无论它是什么类型,都需要基于类似整数的类型。这同样适用于 User.Permission 字段。

如果这些运算符(&、|= 和 &=)对您来说没有意义,请阅读按位运算(按位与和按位或)。

关于database - 多种权限类型(角色)以十进制形式存储在数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60204/

相关文章:

python - 谷歌 colab/bin/bash : 'gdrive/My Drive/path/myfile : Permission denied

php - 在PHP中如何处理MySQL的外键错误?

javascript - 查找文档中引用的人员

java - 如何在preparedStatement中将字符编码格式更改为UTF-8。

java - iTextPdf setEncryption 没有权限

Oracle DBA 角色及其特定功能(以及可能的替代)

database - 文档索引编制-如何检测和存储新的关注者以及已停止关注的人

php - (1/1) FatalErrorException 在 ClearanceMiddleware.php 第 17 行中调用 null 的成员函数 hasPermissionTo()

postgresql - 在 postgres 热备服务器上创建只读用户

meteor - Meteor-Roles 和 Iron-Router 能很好地配合吗?