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

标签 sql permissions

我经常遇到以下场景,我需要提供许多不同类型的权限。我主要将 ASP.NET/VB.NET 与 SQL Server 2000 一起使用。
场景
我想提供一个可以处理不同参数的动态权限系统。假设我想授予部门或特定人员访问应用程序的权限。并假设我们有许多不断增长的应用程序。
过去,我选择了以下两种我知道的方法之一来做到这一点。

  • 使用带有特殊列的单个权限表,这些列用于
    确定如何应用参数。中的特殊列
    这个例子是 TypeIDTypeAuxID . 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/

    相关文章:

    mysql - 一个 SQL 查询已经在托管上运行良好,但在 WAMP 上运行不佳

    php - 我希望我的子查询返回多个值(= 为每个成员),这可能吗?

    django - linux用户权限的最佳实践以如下方式运行Web应用程序?

    python - Windows、Python : time. sleep() 权限错误

    c++ - 如何使用 C++ 在 Linux 中更改文件的权限

    sql - 如果值不存在则插入新行并以任何一种方式获取 id

    mysql - 仅当值不存在时返回行

    php - SQL 按问题排序 - 不能按指定的列排序

    java - 在java中获取环境变量值

    visual-studio-2010 - 无法连接到 Sql Server 数据库 : non-system databases are not shown