在尝试为网络应用程序实现基于角色的安全性时,我在数据库中有一个表用于权限、角色、用户和用户角色(即将用户分配给角色)。
每个角色都有一组权限。权限被定义为 C# 标志枚举,其值为 0、1、2、4 等。
在数据库中,角色表有一个 int 字段,用于存储角色的组合权限标志。 (这样我们就可以避免拥有单独的权限表(这是好还是坏?)和角色权限的一对多表。
在代码中,我通过计算用户分配到的角色的有效权限来检查用户是否具有访问权限。在 .NET 中,通过对枚举标志执行逻辑操作可以很容易地做到这一点。
所以我的问题是:
这样做有什么缺点吗(与拥有权限表和 RolePermission 链接表(其中为授予角色的每个权限包含 1 条记录)相反)?
最佳答案
三个直接的缺点:
- 标志只能包含与可用位一样多的项目。
- 从数据库查询现在变得有点烦人。好吧,只有当您手动使用 SQL 时(通过加入角色表来确定成员资格读起来会好得多)。
- 当查看数据而不是标志时,有人会记得第四位中的值 1 意味着什么吗?
让生活变得轻松,并使用单独的列表。分配给一个集合可以很好地归结为myPermissions.Contains(new Permission("CanEdit"))
。然后,您可以使用各种转换例程将硬编码值(例如枚举或字符串)转换为权限的对象表示形式,以实现 myPermissions.Contains("CanEdit")
等。
这并不是说在单独的表上选择标志会对性能产生影响,反之亦然,我不知道您正在考虑哪种用法。
关于c# - 使用标志枚举来获取权限有哪些缺点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7834703/