【问题标题】:What are the disadvantages of using a flags enum for permissions?使用标志枚举获取权限有什么缺点?
【发布时间】:2011-12-11 16:36:33
【问题描述】:

在尝试为 Web 应用程序实现基于角色的安全性时,我在数据库中有一个表用于权限、角色、用户和 UserRole(即,将用户分配给角色)。

每个角色都有一组权限。权限定义为一个 C# 标志枚举,其值为 0、1、2、4 等。

在数据库中,角色表有一个 int 字段,用于存储角色的组合权限标志。 (这样我们就可以避免使用单独的 Permissions 表(好还是坏?)和 RolePermissions 的一对多表。

在代码中,我通过计算分配给用户的角色的有效权限来检查用户是否具有访问权限。在 .NET 中,通过对枚举标志执行逻辑操作很容易做到这一点。

所以我的问题是:

这样做有缺点吗(与拥有 Permission 表和 RolePermission 链接表(对于授予角色的每个权限包含 1 条记录)相反)?

【问题讨论】:

    标签: c# asp.net enums roles enum-flags


    【解决方案1】:

    三个直接的缺点:

    • 标志只能包含与可用位一样多的项目。
    • 从数据库查询现在变得有点烦人。好吧,只有当您手动使用 SQL 时(加入角色表以确定成员身份会更好读)。
    • 当查看数据而不是标志时,有人会记得第四位的值 1 是什么意思吗?

    让生活变得轻松,并使用单独的列表。在集合中分配到可以很好地归结为myPermissions.Contains(new Permission("CanEdit"))。然后,您可以使用各种转换例程将硬编码值(例如枚举或字符串)转换为权限的对象表示,以实现myPermissions.Contains("CanEdit") 等。

    这并不是说在单独的表上选择标志会影响性能,反之亦然,我不知道你在看哪种用法。

    【讨论】:

    • 谢谢。用法并不太奇特。这是一个多租户 Web 应用程序,每个租户都希望定义自己的角色名称并将其用户分配给他们的自定义角色。他们当然需要为每个自定义角色分配一组标准权限。
    【解决方案2】:

    唯一的缺点是您最终会编写更多代码来检查权限。拥有一个包含用户角色的单独表使得确定它们变得非常简单。

    • 优点:节省存储空间(但谁在乎这个 场景?)
    • 缺点:代码更复杂。

    【讨论】:

    • 我实际上认为代码更简单。这只是根据需要 &-ing 或 |-ing 权限的问题。
    【解决方案3】:

    就像你 3 年前在一个项目中描述的那样,我使用了一个标志枚举。我的考虑:

    • 创建一个层来简化使用,否则你最终会在前端得到一个凌乱的代码
    • 对于“新开发人员”来说并不直观。如果其他人会维护此代码,请注意他可能会错过整个想法并引入更多复杂性和/或错误...

    附言:

    每个角色都有一组权限。权限定义为一个 C# 标志枚举,其值为 0、1、2、4 等。

    切勿在标志枚举中使用 0...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-20
      • 2013-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-06
      • 2021-07-31
      相关资源
      最近更新 更多