在尝试为Web应用程序实现基于角色的安全性时,我在数据库中有一个用于Permissions,Roles,Users和UserRole的表(即将用户分配给角色)。
每个角色都有一组权限。权限定义为C#标志枚举,其值为0,1,2,4等。
在数据库中,角色表有一个int字段,用于存储角色的组合权限标志。 (这样我们就可以避免使用单独的Permissions表(是好还是坏?)和RolePermissions的一对多表。
在代码中,我通过计算用户被分配到的角色的有效权限来检查用户是否具有访问权限。在.NET中,通过对枚举标志执行逻辑操作非常容易。
所以我的问题是:
这样做是否有缺点(与拥有Permission表和RolePermission链接表(包含给角色的每个权限包含1条记录)相反)?
答案 0 :(得分:1)
三个直接的缺点:
让生活更轻松,并使用单独的列表。分配到集合中可以很好地归结为myPermissions.Contains(new Permission("CanEdit"))
。然后,您可以使用各种转换例程将硬编码值(如枚举或字符串)转换为权限的对象表示,以实现myPermissions.Contains("CanEdit")
等。
这并不是说在单独的表上选择标志会产生性能影响,反之亦然,我不知道你在看什么样的用法。
答案 1 :(得分:1)
唯一的缺点是你最终会编写更多代码来检查权限。使用具有用户角色的单独表格可以非常简单地确定它们。
答案 2 :(得分:1)
我使用了一个标志枚举,就像你3年前在一个项目中描述的那样。我的考虑因素:
PS:
每个角色都有一组权限。权限定义为C#标志枚举,其值为0,1,2,4等。
从不在标志枚举中使用0 ......