在尝试为Web应用程序实现基于角色的安全性时,我在数据库中有一个用于Permissions,Roles,Users和UserRole的表(即将用户分配给角色) .
每个角色都有一组权限 . 权限定义为C#标志枚举,其值为0,1,2,4等 .
在数据库中,角色表有一个int字段,用于存储角色的组合权限标志 . (这样我们就可以避免使用单独的Permissions表(是好还是坏?)和RolePermissions的一对多表 .
在代码中,我通过计算用户被分配到的角色的有效权限来检查用户是否具有访问权限 . 在.NET中,通过对枚举标志执行逻辑操作非常容易 .
所以我的问题是:
这样做是否有缺点(与拥有Permission表和RolePermission链接表(包含给角色的每个权限包含1条记录)相反)?
3 回答
三个直接的缺点:
标志只能包含与可用位一样多的项目 .
从数据库中查询现在变得更加烦人 . 好吧,只有你手动使用SQL(连接到角色表以确定成员资格读得更好) .
当查看数据不是标志时,是否有人会记住第四位中的值为1意味着什么?
让生活变得轻松,并使用单独的列表 . 分配到一个集合可以非常好地归结为
myPermissions.Contains(new Permission("CanEdit"))
. 然后,您可以使用各种转换例程将硬编码值(如枚举或字符串)转换为权限的对象表示,以实现myPermissions.Contains("CanEdit")
等 .这并不是说在单独的表上选择标志会产生性能影响,反之亦然,我不知道你在看什么样的用法 .
唯一的缺点是,您最终会编写更多代码以检查权限 . 使用具有用户角色的单独表格可以非常简单地确定它们 .
优势:节省存储空间(但在这种情况下谁会关心这个?)
缺点:代码更加复杂 .
我使用了一个标志枚举就像你3年前在一个项目中描述的那样 . 我的考虑:
创建一个图层以简化使用,或者您最终会在前端使用凌乱的代码
'new developers'不直观 . 如果其他人将维护此代码,请注意他可能会错过整个想法并引入更多复杂性和/或错误...
PS:
NEVER 在标志枚举中使用0 ...