Database design 管理web应用程序权限的最佳方法是什么?位掩码还是数据库表?
我正在考虑为“管理员”web应用程序设计权限系统的最佳方法。应用程序可能有许多用户,每个用户都可以被分配一个特定的角色;可以允许其中一些用户在角色之外执行特定任务 我可以想出两种设计方法:一种是为每个用户提供一行“权限”表,另一种是为每个任务分配权限的布尔列。像这样: User ID Manage Users Manage Products Manage Promotions Manage Orders 1 true true true true 2 false true true true 3 false false false true 用户ID管理用户管理产品管理促销管理订单 1对对对对 2假-真-真-真 3假假假真 我想到的另一种方法是使用位掩码来存储这些用户权限。对于32位有符号整数,这会将可管理的任务数量限制为31个,但实际上,用户执行的特定任务不可能超过31个。这样,数据库模式将更简单,并且我们不必每次添加需要访问控制的新任务时都更改表结构。像这样: User ID Permissions (8-bit mask), would be ints in table 1 00001111 2 00000111 3 00000001 用户ID权限(8位掩码)将是表中的整数 1 00001111 2 00000111 3 00000001 这里的人们通常使用什么机制,为什么Database design 管理web应用程序权限的最佳方法是什么?位掩码还是数据库表?,database-design,web-applications,permissions,Database Design,Web Applications,Permissions,我正在考虑为“管理员”web应用程序设计权限系统的最佳方法。应用程序可能有许多用户,每个用户都可以被分配一个特定的角色;可以允许其中一些用户在角色之外执行特定任务 我可以想出两种设计方法:一种是为每个用户提供一行“权限”表,另一种是为每个任务分配权限的布尔列。像这样: User ID Manage Users Manage Products Manage Promotions Manage Orders 1 true
谢谢 创建一个权限表,然后创建一个UserPermission表来存储关系怎么样
您再也不必修改结构,并且可以添加任意多的权限。权限通常是带有1、0或null(表示继承)的关键字。对于bit系统,您可能无法在用户id和权限关键字上创建索引;相反,您必须扫描每个记录才能获得权限值 我会说选择第一种。在我看来,这似乎是更好的解决方案:
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` )
我两方面都做过。但是我不再经常用口罩了。如果将用户id或组id作为外键,则可以使用单独的表作为交叉引用
UserID | Permission
===================
1 | 1 1 representing manage users
1 | 2 2 being manger products
2 | 3
这种方式将更易于维护,并在以后添加
我还将使用一个单独的表来管理权限
PermissionID | Description
==========================
1 | Manage Users
2 | Manager Products
我见过一些类似于您建议的权限受限系统,以及一些非常糟糕的系统。在一些简单的情况下,只要应用程序不变得更复杂,它们是可以接受的。然而,在许多情况下,它们确实变得更加复杂,必须重写系统以适应所需的功能 如果你认为有一天你可能需要这种表现力,我会选择一个包含用户和组(或角色)的完整ACL(访问控制列表)系统。也就是说,受权限控制的每件事(例如,“管理用户”、“管理产品”)都有一个ACL,它是所有有权访问它的用户和组的列表。然后,用户要么直接添加到相关ACL,要么添加到已经是ACL成员的组
虽然ACL建议使用列表实现,但最好使用表;这是一个很好的方法。我认为,一般的经验法则是远离编码宇宙意义的神秘比特串
虽然可能会更笨拙,但拥有一个可能的权限表、一个用户表以及它们之间的链接表是组织这一切的最好和最清晰的方式。它还使您的查询和维护(特别是对于新手)变得更加容易。我建议您使用角色提供者的概念来抽象您的web应用程序权限。从2.0版开始,这在.NET中作为提供给您 其基本思想是,通过针对框架而不是特定的存储机制编写权限检查来利用现有框架。然后,您可以使用Windows软件授权管理器插入任何可用的存储机制,无论是XML文件、数据库,甚至是数据库(例如,它允许您无缝地将自定义权限绑定到LDAP—无需配置代码) 如果决定使用数据库作为存储机制,则支持多个数据库来自动创建框架所需的底层表。这包括在Mono上运行.NET和在MySQL上使用角色提供程序模型 有关更多信息,请参阅。完全有可能其他语言/环境也有库,您可以利用这些库来实现这个概念——这是值得研究的 编辑:我还应该指出,web应用程序如何连接到存储机制的配置是通过web.config文件完成的,不需要更改代码。我发现这对于在本地机器上测试代码库的生产版本非常有用,使用XML文件模拟权限而不是普通的数据库提供程序—所有这些都是通过修改web.config中的两行代码实现的
我忘了提到的另一件事是,您可以通过扩展基类来插入自己的自定义提供程序,允许您利用权限模型,但仍然使用专有存储系统(如位掩码,如果您真的愿意)。通常我有一个用户表、一个角色表和一个用户角色表。这样,在不更改数据库结构的情况下,您可以拥有无限数量的角色,并且用户可以担任多个角色 我强制应用程序仅针对角色(从不针对用户)进行授权。请注意,角色表中的“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
)