pipe理Web应用程序权限的最佳方式是什么 – 位掩码或数据库表?

我正在考虑为“pipe理员”Web应用程序devise权限系统的最佳方法。 应用程序可能有许多用户,每个用户都可以分配一定的angular色; 其中一些用户可以被允许在angular色之外执行特定的任务。

我可以想出两种方法来devise这个function:一种是每个用户都有一个“权限”表,每行有一个布尔列,每个任务都有一个布尔列,为他们分配执行这些任务的权限。 喜欢这个:

用户IDpipe理用户pipe理产品pipe理促销pipe理订单
 1 true true true true
 2假真真真实
 3假假假假真

我想到的另一种方式是使用一个位掩码来存储这些用户权限。 这将限制32位有符号整数可以pipe理的任务数量为31,但实际上我们不太可能有超过31个用户可以执行的特定任务。 这样,数据库模式会更简单,每当我们添加需要访问控制的新任务时,我们就不必更改表结构。 喜欢这个:

用户ID权限(8位掩码)将在表格中整理
 1 00001111
 2 00000111
 3 00000001

这里通常使用什么机制,为什么?

谢谢!

我认为,远离那些编码宇宙意义的神秘比特串是一般的经验法则。

虽然也许更笨拙,但拥有一张可能的权限表,一张用户表,以及它们之间的链接表是组织这个最好和最明确的方式。 这也使您的查询和维护(尤其是新人)更容易。

如何创build一个权限表,然后一个UserPermission表来存储关系?

你永远不需要再次修改结构,并且你可以根据需要添加许多权限。

我已经做到了这一点。 但是我已经不再使用口罩了。 一个单独的表格可以用作交叉引用,只要用户ID或组ID是外键。

UserID | Permission =================== 1 | 1 1 representing manage users 1 | 2 2 being manger products 2 | 3 

这种方式会更容易维护和添加到以后。

我也使用一个单独的表来pipe理权限是什么。

 PermissionID | Description ========================== 1 | Manage Users 2 | Manager Products 

通常我有一个用户表,一个angular色表和一个UserRoles表。 这样,您可以拥有无​​限数量的angular色,而无需更改您的数据库结构,并且用户可以处于多个angular色。

我强制应用程序只授权对angular色(从来没有用户)。 注意angular色表中的“id”列是不是一个标识列。 这是因为您可能需要控制放在此表中的ID,因为您的应用程序将不得不查找特定的ID。

结构如下所示:

 create table Users ( id int identity not null, loginId varchar(30) not null, firstName varchar(50) not null, etc... ) create table Roles ( id int not null, name varchar(50) not null ) create table UserRoles ( userId int not null, roleId int not null ) 

我build议用angular色提供者的概念抽象你的Web应用程序权限。 从版本2.0开始,这是在.NET中为您提供的System.Web.Security.RoleProvider 。

基本的想法是,你利用现有的框架,通过编写你的权限检查框架,而不是一个特定的存储机制。 然后,您可以插入任何可用的存储机制,无论是XML文件,数据库还是使用Windows软件授权pipe理器的授权存储 (例如,您可以无缝地将自定义权限绑定到LDAP)代码需要configuration)。

如果您决定使用数据库作为存储机制,则支持多个数据库来自动创build框架所需的基础表。 这包括在Mono上运行.NET,并在MySQL之上使用angular色提供者模型。

请参阅实施angular色提供者以获取更多信息。 其他语言/环境也可能有一些库可以用来实现这个概念,这是值得研究的。

编辑 :我也应该指出你的Web应用程序如何绑定到存储机制的configuration是通过web.config文件完成的,并且不需要更改代码。 我发现这非常有用,可以在我的本地机器上testing代码库的生产版本,使用XML文件模仿权限而不是普通的数据库提供者 – 全部通过修改web.config中的两行。

另外我忘记提到的是,你可以通过扩展基类来插入你自己定制的提供者,允许你利用权限模型,但仍然使用一个专有的存储系统(比如,如果你真的想要使用位掩码) 。

我已经看到了一些有限的权限系统,类似于你所build议的 – 以及一些真正可怕的系统。 在一些简单的情况下,他们可以被接受,只要应用程序不会变得更复杂。 然而,在很多情况下,它们变得更加复杂,系统必须重写以适应所需的function。

如果你认为你可能有一天需要expression能力,那么我会使用一个完整的ACL(访问控制列表)系统,带有用户和组(或angular色)。 也就是说,每个由权限pipe理的东西(例如“pipe理用户”,“pipe理产品”)都有一个ACL,它是所有访问权限的用户和组的列表。 然后将用户直接添加到相关的ACL中,或者将其添加到已经是ACL成员的组中。

虽然ACLbuild议一个列表实现,你最好用一个表; 这个答案是一个好方法。

如果您处于托pipe环境中,则可以使用Active Directory或其他LDAP实现。 这样,确定权限的安全组可以通过第一线支持来pipe理,使用他们最可能已经熟悉的技术。

如果您的应用程序是收缩包装的,那么Levi Rosolbuild议您对数据库进行规范化处理,以便在应用程序中具有可扩展的数据模型。

权限通常是关键字,有1,0或null(表示inheritance)。 用一个位系统,你可能不能在用户标识和权限关键字上创build索引; 相反,您将不得不扫描每个logging以获取权限值。

我会说去第一个选项。 在我看来,更好的解决scheme是:

 create table permissions ( user_id INT NOT Null, permission VARCHAR(255) NOT NULL, value TINYINT(1) NULL ) alter table `permissions` ADD PRIMARY KEY ( `user_id` , `permission` )