我经常会遇到下面的情况下,我需要提供很多不同类型的权限。 我主要使用ASP.NET / VB.NET与SQL Server 2000。
脚本
我想提供一个动态的权限系统,可以在不同的参数工作。 比方说,我想给任何一个部门或只是一个特定的人访问应用程序。 假装我们有一个数量的应用程序不断增加。
在过去,我已经选择以下两种方法,我知道做到这一点的。
使用一个单一的权限表与用于确定如何适用参数的特殊列。 在这个例子中的特殊列TYPEID和TypeAuxID。 在SQL会是这个样子。
SELECT COUNT(PermissionID) FROM application_permissions WHERE (TypeID = 1 AND TypeAuxID = @UserID) OR (TypeID = 2 AND TypeAuxID = @DepartmentID) AND ApplicationID = 1
使用映射表中的每个类型的权限,然后将它们连接在一起。
SELECT COUNT(perm.PermissionID) FROM application_permissions perm LEFT JOIN application_UserPermissions emp ON perm.ApplicationID = emp.ApplicationID LEFT JOIN application_DepartmentPermissions dept ON perm.ApplicationID = dept.ApplicationID WHERE q.SectionID=@SectionID AND (emp.UserID=@UserID OR dept.DeptID=@DeptID OR (emp.UserID IS NULL AND dept.DeptID IS NULL)) AND ApplicationID = 1 ORDER BY q.QID ASC
我的想法
我希望的例子是有意义的。 我拼凑在一起。
第一个例子需要较少的工作,但他们都不觉得自己是最好的答案。 有没有更好的方式来处理呢?
我同意约翰·唐尼。
就个人而言,我有时使用权限的标记枚举。 这样,您就可以在列举的项目使用AND,OR,NOT和XOR位操作。
"[Flags]
public enum Permission
{
VIEWUSERS = 1, // 2^0 // 0000 0001
EDITUSERS = 2, // 2^1 // 0000 0010
VIEWPRODUCTS = 4, // 2^2 // 0000 0100
EDITPRODUCTS = 8, // 2^3 // 0000 1000
VIEWCLIENTS = 16, // 2^4 // 0001 0000
EDITCLIENTS = 32, // 2^5 // 0010 0000
DELETECLIENTS = 64, // 2^6 // 0100 0000
}"
然后,你可以结合使用AND位运算符的几个权限。
例如,如果一个用户可以查看和编辑的用户,操作的二进制结果为0000 0011其转换为十进制是3。
然后,您可以将一个用户的权限存储到数据库中的一列(在我们的情况下,将3)。
你的应用程序中,你只需要另一个位运算(OR)来验证用户是否有特定的权限或没有。
就我通常去编码许可系统是有6张桌子。
- 用户 - 这是相当直截了当它是典型的用户表
- 组 - 这将是同义的部门
- 角色 - 这是所有权限通常也包括人类可读的名称和说明一个表
- Users_have_Groups - 这就是群体的许多一对多表用户属于
- Users_have_Roles - 什么样的角色都分配给单个用户的另一许多一对多表
- Groups_have_Roles - 什么角色每组最后许多一对多表
在用户会话开始时,你会运行翻出每一个他们所分配的角色,无论是目录或通过一组一些逻辑。 然后,你的代码对这些角色的安全权限。
就像我说的,这是我通常做,但你millage可能会有所不同。
除了约翰·唐尼和jdecuyper的解决方案,我还添加了一个“明确拒绝”位的位字段的结束/开始,这样就可以通过组,角色成员资格进行添加剂的权限,然后减去基于明确的权限拒绝条目,很像NTFS的作品,许可明智的。
老实说ASP.NET成员/角色功能将完全为你工作描述的场景。 编写自己的表/特效/班是一个很好的锻炼,你可以得到在微小的细节很不错的控制,但这样做我自己后,我已经得出结论,最好只使用内置的.NET的东西。 很多现有代码的目的是解决它,这是很好的很好。 从头开始编写我花了2周左右,这是近一样强大.NETs没有在那里。 你必须编写那么多的废话(密码恢复,自动锁定,加密,角色,权限界面,特效吨的等),时间可能在其他地方可能会更好一些。
很抱歉,如果我没有回答你的问题,我很喜欢谁说学习C#当有人问一个VB问题的人。
我已经在各种应用中使用的方法是让具有多变的Value属性的通用PermissionToken类。 然后您查询请求的应用程序,它会告诉你这是必要的,以使用它PermissionTokens。
例如,运输应用可能会告诉你,它需要:
new PermissionToken()
{
Target = PermissionTokenTarget.Application,
Action = PermissionTokenAction.View,
Value = "ShippingApp"
};
这可以明显地扩展到创建,编辑,删除等,并且因为自定义值属性,任何应用程序,模块或部件也可以定义自己所需的权限。 因人而异,但是这一直是我的一个有效的方法,我已经找到了很好地扩展。