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

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

方案</强>

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

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

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

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 [email protected]
  AND ([email protected] OR [email protected] OR
 (emp.UserID IS NULL AND dept.DeptID IS NULL)) AND ApplicationID = 1
ORDER BY q.QID ASC

我的想法

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

第一个例子需要较少的工作,但他们都不觉得是最好的答案。有没有更好的方法来处理这个问题?

0
额外 编辑
意见: 2

5 答案

老实说,ASP.NET Membership / Roles功能对于你描述的场景来说是完美的。编写你自己的tables / procs / classes是一个很好的练习,你可以很好地控制一些细节,但自己做完这些之后,我总结出最好只使用内置的.NET。很多现有的代码都是为了解决这个问题而设计的,它很好。从头开始写了大约2周的时间,并没有像.NET那样健壮。你必须编写如此多的废话(密码恢复,自动锁定,加密,角色,许可界面,吨过程等),时间可以更好地花在其他地方。

对不起,如果我没有回答你的问题,我就像那个说有人在问vb问题时学习c#的人。

0
额外

我在各种应用程序中使用的方法是拥有一个通用的PermissionToken类,该类具有可更改的Value属性。然后,您查询请求的应用程序,它会告诉您需要哪些PermissionTokens才能使用它。

例如,发货应用程序可能会告诉你它需要:

new PermissionToken()
{
    Target = PermissionTokenTarget.Application,
    Action = PermissionTokenAction.View,
    Value = "ShippingApp"
};

这显然可以扩展到创建,编辑,删除等,并且由于自定义Value属性,任何应用程序,模块或小部件都可以定义其自己的必需权限。 YMMV,但这对我来说一直是一种有效的方法,而且我发现它的规模很好。

0
额外

除了John Downey和jdecuyper的解决方案之外,我还在位域的末尾添加了一个“显式拒绝”位,以便您可以通过组,角色成员身份执行附加的权限,然后根据显式拒绝来减去权限条目,非常像NTFS的工作,权限明智。

0
额外

我同意约翰唐尼。

就我个人而言,我有时会使用标记的权限枚举。通过这种方式,您可以对枚举项目使用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
}"

Then, you can combine several permissions using the AND bitwise operator.

For example, if a user can view & edit users, the binary result of the operation is 0000 0011 which converted to decimal is 3.
You can then store the permission of one user into a single column of your DataBase (in our case it would be 3).

Inside your application, you just need another bitwise operation (OR) to verify if a user has a particular permission or not.

0
额外
我用这种方法发现的问题是,使用这种方法很容易耗尽角色。正如你所看到的,6个角色的值为2 ^ 6 = 64,当31个角色将有2 ^ 31 = 2,147,483,647这是最大的int值。所以在T-SQL中,可以使用的最大数据类型是 bigint (2 ^ 63)。当然你可以使用varchar类型,但是当我有很多角色时,我更喜欢使用John Downey的解决方案。
额外 作者 Maksim Vi.,

我通常关于编码权限系统的方式是拥有6个表格。

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

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

就像我说过的那样,我通常会这样做,但是你的米勒可能会有所不同。

0
额外