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

Har*_*ari 52 permissions database-design web-applications

我正在考虑为"管理"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

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

User ID          Permissions (8-bit mask), would be ints in table
1                00001111
2                00000111
3                00000001

人们通常使用什么机制,为什么?

谢谢!

Luc*_*man 74

我认为远离编码宇宙意义的神秘位串是一般的经验法则.

虽然可能比较笨拙,但是拥有可能的权限表,用户表以及它们之间的链接表是组织它的最佳和最清晰的方法.它还使您的查询和维护(特别是对于新人)更容易.

  • 关键不在于开发人员是否能够理解比特掩码是什么.关键是开发人员是否可以确定_particular_位掩码中每个位的用途.除非您正在处理需要极低延迟的任务关键型软件,否则总是更容易被理解而不是聪明/快速.除非这是一个爱好项目,在这种情况下,要像你想要的那样聪明,并且祝你在回到它的时候弄清楚你在想什么? (10认同)
  • 你能为"一般的经验法则远离神秘的位串"提供任何重要的基础吗?因为我正在考虑使用bitstring来获得许可. (7认同)
  • 嗯,这不是完全自我记录,我认为它违反了最不惊讶的原则.它也很脆弱,它假设列总是以一定的顺序排列(我不是数据库管理员,但很确定这是一个严厉的禁忌),我打赌用一个编辑遗留数据库不会很有趣许多数据实现了这些神秘的字节字符串,以允许不同的产品线,不同类型的用户的不同管理权限,或调整同一公司的不同部分的规则. (3认同)

Lev*_*sol 33

如何创建Permission表,然后是UserPermission表来存储关系?

您永远不必再次修改结构,并且您可以根据需要添加任意数量的权限.

  • 这是完全正确的.如果您最终获得了许多模块的细粒度权限,那么最终可能会有数百种功能.在这种安排中,一组列或位掩码都不会令人愉快,但你的想法可以很好地扩展. (6认同)

ste*_*yer 24

我已经做到了两个方面.但我不再使用比特面具了.在用户ID或组ID作为外键的情况下,可以将单独的表用作交叉引用.

UserID | Permission
===================
1      | 1              1 representing manage users
1      | 2              2 being manger products
2      | 3 
Run Code Online (Sandbox Code Playgroud)

这种方式更容易维护并在以后添加.

我还使用一个单独的表来管理权限.

PermissionID | Description
==========================
1            | Manage Users
2            | Manager Products
Run Code Online (Sandbox Code Playgroud)


Cha*_*uin 8

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

我强制应用程序仅授权角色(从不用户).请注意角色表中的"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
)
Run Code Online (Sandbox Code Playgroud)