我经常遇到以下场景,我需要提供许多不同类型的权限.我主要使用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
Run Code Online (Sandbox Code Playgroud)为每种类型的权限使用映射表,然后将它们连接在一起.
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
Run Code Online (Sandbox Code Playgroud)我的想法
我希望这些例子有意义.我把它们拼凑在一起.
第一个例子需要较少的工作,但他们都不是最好的答案.有没有更好的方法来处理这个?
jde*_*per 13
我同意约翰唐尼的观点.
就个人而言,我有时会使用标记的权限枚举.这样,您可以对枚举的项使用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
}"
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用AND按位运算符组合多个权限.
例如,如果用户可以查看和编辑用户,则操作的二进制结果为0000 0011,转换为十进制为3.
然后,您可以将一个用户的权限存储到DataBase的单个列中(在我们的示例中,它将是3).
在您的应用程序中,您只需要另一个按位操作(OR)来验证用户是否具有特定权限.
我通常使用编码权限系统的方式是有6个表.
在用户会话开始时,您将运行一些逻辑来提取他们分配的每个角色,无论是目录还是通过组.然后,您将这些角色编码为安全权限.
就像我说的那样,这是我通常做的,但你的millage可能会有所不同.