我经常遇到以下场景,我需要提供许多不同类型的权限。我主要将 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) 来验证用户是否具有特定权限。
关于sql - 处理多种权限类型的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1451/