2

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

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

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

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

所以我的问题是:

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

4

3 回答 3

1

三个直接的缺点:

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

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

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

于 2011-10-20T10:41:10.003 回答
1

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

  • 优点:节省存储空间(但在这种情况下谁在乎呢?)
  • 缺点:代码更复杂。
于 2011-10-20T10:48:27.390 回答
1

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

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

附言:

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

永远不要在标志枚举中使用 0...

于 2011-10-20T12:21:28.013 回答