什么是处理多个权限类型的最佳方式?(What is the best way to handle m

2019-08-08 04:18发布

我经常会遇到下面的情况下,我需要提供很多不同类型的权限。 我主要使用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 
  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 

我的想法

我希望的例子是有意义的。 我拼凑在一起。

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

Answer 1:

我同意约翰·唐尼。

就个人而言,我有时使用权限的标记枚举。 这样,您就可以在列举的项目使用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)来验证用户是否有特定的权限或没有。



Answer 2:

就我通常去编码许可系统是有6张桌子。

  • 用户 - 这是相当直截了当它是典型的用户表
  • 组 - 这将是同义的部门
  • 角色 - 这是所有权限通常也包括人类可读的名称和说明一个表
  • Users_have_Groups - 这就是群体的许多一对多表用户属于
  • Users_have_Roles - 什么样的角色都分配给单个用户的另一许多一对多表
  • Groups_have_Roles - 什么角色每组最后许多一对多表

在用户会话开始时,你会运行翻出每一个他们所分配的角色,无论是目录或通过一组一些逻辑。 然后,你的代码对这些角色的安全权限。

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



Answer 3:

除了约翰·唐尼和jdecuyper的解决方案,我还添加了一个“明确拒绝”位的位字段的结束/开始,这样就可以通过组,角色成员资格进行添加剂的权限,然后减去基于明确的权限拒绝条目,很像NTFS的作品,许可明智的。



Answer 4:

老实说ASP.NET成员/角色功能将完全为你工作描述的场景。 编写自己的表/特效/班是一个很好的锻炼,你可以得到在微小的细节很不错的控制,但这样做我自己后,我已经得出结论,最好只使用内置的.NET的东西。 很多现有代码的目的是解决它,这是很好的很好。 从头开始编写我花了2周左右,这是近一样强大.NETs没有在那里。 你必须编写那么多的废话(密码恢复,自动锁定,加密,角色,权限界面,特效吨的等),时间可能在其他地方可能会更好一些。

很抱歉,如果我没有回答你的问题,我很喜欢谁说学习C#当有人问一个VB问题的人。



Answer 5:

我已经在各种应用中使用的方法是让具有多变的Value属性的通用PermissionToken类。 然后您查询请求的应用程序,它会告诉你这是必要的,以使用它PermissionTokens。

例如,运输应用可能会告诉你,它需要:

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

这可以明显地扩展到创建,编辑,删除等,并且因为自定义值属性,任何应用程序,模块或部件也可以定义自己所需的权限。 因人而异,但是这一直是我的一个有效的方法,我已经找到了很好地扩展。



文章来源: What is the best way to handle multiple permission types?