处理多种权限类型的最佳方法是什么?

End*_*ssa 22 sql permissions

我经常遇到以下场景,我需要提供许多不同类型的权限.我主要使用ASP.NET/VB.NET和SQL Server 2000.

脚本

我想提供一个可以处理不同参数的动态权限系统.假设我想要一个部门或只是一个特定的人访问一个应用程序.并假装我们有许多应用程序不断增长.

在过去,我选择了以下两种方式中的一种,我知道这样做.

  1. 使用具有特殊列的单个权限表,这些列用于确定如何应用参数.此示例中的特殊列是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)
  2. 为每种类型的权限使用映射表,然后将它们连接在一起.

    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)来验证用户是否具有特定权限.


Joh*_*ney 9

我通常使用编码权限系统的方式是有6个表.

  • 用户 - 这非常简单,它是您典型的用户表
  • 组 - 这将是您的部门的同义词
  • 角色 - 这是一个包含所有权限的表,通常还包括人类可读的名称和描述
  • Users_have_Groups - 这是用户所属组的多对多表
  • Users_have_Roles - 分配给单个用户的角色的另一个多对多表
  • Groups_have_Roles - 每个组具有哪些角色的最终多对多表

在用户会话开始时,您将运行一些逻辑来提取他们分配的每个角色,无论是目录还是通过组.然后,您将这些角色编码为安全权限.

就像我说的那样,这是我通常做的,但你的millage可能会有所不同.