当前位置: 首页 > 面试题库 >

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

微生令
2023-03-14
问题内容

我经常遇到以下情况,其中我需要提供许多不同类型的权限。我主要在SQL Server 2000中使用ASP.NET/VB.NET。

设想

我想提供一个可以在不同参数上工作的动态权限系统。假设我想授予部门或特定人员访问应用程序的权限。并假装我们拥有不断增长的应用程序。

过去,我选择了我知道的以下两种方法之一。

  1. 将单个许可权表与特殊列一起使用,这些特殊列用于确定如何应用参数。此示例中的特殊列为TypeIDTypeAuxID。SQL看起来像这样。

    SELECT COUNT(PermissionID)
    

    FROM application_permissions
    WHERE
    (TypeID = 1 AND TypeAuxID = @UserID) OR
    (TypeID = 2 AND TypeAuxID = @DepartmentID)
    AND ApplicationID = 1

  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

我的想法

我希望这些例子有意义。我把它们拼凑在一起。

第一个示例需要较少的工作,但是它们都不是最佳答案。有没有更好的方法来解决这个问题?


问题答案:

我同意约翰·唐尼的观点。

就个人而言,有时会使用标记的权限枚举。这样,您可以对枚举项使用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)即可验证用户是否具有特定的权限。



 类似资料:
  • 问题内容: 我已经和Docker玩了一段时间,在处理持久性数据时继续寻找相同的问题。 我创建我的文件并公开一个卷,或使用它[在容器中安装主机文件夹]。 我应该对主机上的共享卷应用什么权限? 我可以想到两种选择: 到目前为止,我已经授予所有人读取/写入访问权限,因此我可以从Docker容器写入该文件夹。 将用户从主机映射到容器,以便我可以分配更多的细化权限。不确定这是否可能,但尚未找到很多相关信息。

  • 我使用Docker已经有一段时间了,并且在处理持久数据时不断发现相同的问题。 我创建并公开卷,或者使用在容器中装入主机文件夹。 我应该对主机上的共享卷应用什么权限? 我能想到两个选择: > 到目前为止,我已经为每个人提供了读/写访问权限,因此我可以从Docker容器写入文件夹。 将用户从主机映射到容器中,这样我就可以分配更多的粒度权限。不确定这是可能的,但还没有找到很多关于它。到目前为止,我所能做

  • 问题内容: 我有一个方法可以执行一些超时任务。我使用ExecutorServer.submit()获取Future对象,然后使用超时调用future.get()。这工作正常,但是我的问题是处理可能由我的任务引发的检查异常的最佳方法。以下代码可以正常工作,并保留检查的异常,但是如果方法签名中的检查的异常列表发生更改,则显得非常笨拙且容易中断。 对于如何解决这个问题,有任何的建议吗?我需要以Java

  • 我有一个超时执行任务的方法。我使用ExecutorServer.submit()获取一个Future对象,然后调用future.get()并超时。这很好,但是我的问题是处理我的任务可能抛出的检查异常的最好方法。下面的代码工作正常,并且保留了被检查的异常,但是如果方法签名中被检查的异常的列表改变了,它看起来非常笨拙并且容易出错。 关于如何解决这个问题的任何建议?我需要以Java 5为目标,但我也很好

  • 因此,我有一个Javascript脚本,它在一个循环中将小的分数相加,它有可能将0.2加到0.1。然后,这个值被输入到另一个函数,但问题是,我需要0.3来精确输入,而不是0.3000000000000004。 什么是最简单的方法,以确保数字是正确和准确的。注意,它可能得到0.25+0.125等,被添加到简单的四舍五入到小数点1不会解决问题。 也有可能添加0.2+0.1000000000000000

  • 上周,我决定尝试Perl6,并开始重新实现我的一个程序。我不得不说,Perl6对于对象编程来说非常容易,这对我来说是Perl5非常痛苦的一个方面。 我的程序必须读取和存储大文件,如整个基因组(高达3 Gb或更多,见下面的例子1)或制表数据。 代码的第一个版本是通过逐行迭代以Perl5的方式制作的(“基因组.fa”。对于正确的执行时间,它非常慢且不可行。 所以经过一点RTFM之后,我改变了文件上的s