tau*_*orf 43 database-design best-practices
我有一个带有用户表和角色表的数据库模型。我想控制对多达 10 个不同元素的访问(权限)。可以将访问权限授予角色或单个用户。下面是用户、角色和项目的表定义:
CREATE TABLE users
(
id serial NOT NULL PRIMARY KEY,
username character varying UNIQUE,
password character varying,
first_name character varying,
last_name character varying,
...
);
CREATE TABLE roles
(
id serial NOT NULL PRIMARY KEY,
name character varying NOT NULL,
description character varying,
...
);
CREATE TABLE element_1
(
id serial NOT NULL PRIMARY KEY,
name character varying NOT NULL,
description character varying,
...
);
...
Run Code Online (Sandbox Code Playgroud)
现在我有两种不同的方式来设计版权。一个带有权限类型列的表或 10 个权限表 - 一个用于我想要控制访问的每个元素。
每个元素一个权限表与一个权限表的优缺点是什么?- 或者是更合适的方式来做到这一点?
gar*_*rik 36
首先,您计划实施什么类型的安全模型?基于角色的访问控制 (RBAC) 还是自主访问控制 (DAC)?
RBAC 在基于角色的访问控制 (RBAC) 模型中,对资源的访问是基于分配给用户的角色。在此模型中,管理员将用户分配给具有某些预定权限和特权的角色。由于用户与角色的关联,用户可以访问某些资源并执行特定任务。RBAC 也称为非自主访问控制。分配给用户的角色是集中管理的。
DAC 在自主访问控制 (DAC) 模型中,对资源的访问基于用户的身份。通过将用户置于与资源关联的访问控制列表 (ACL) 中,可以授予用户对资源的权限。资源 ACL 上的条目称为访问控制条目 (ACE)。当用户(或组)是 DAC 模型中对象的所有者时,该用户可以向其他用户和组授予权限。DAC 模型基于资源所有权。
1)在RBAC中:您需要ElementType表来为角色分配权限(用户被分配给角色)。RBAC 定义:“这个角色/用户可以做什么”。管理员分配角色权限和角色权限,将用户分配给角色以访问资源。2) 在 DAC 中:用户和角色通过访问控制列表(所有权)对元素拥有权限。DAC 定义:“谁可以访问我的数据”。用户(所有者)授予拥有资源的权限。
无论如何我建议这个数据模型:
CREATE TABLE ElementType
(
Id (PK)
Name
...
)
CREATE TABLE ElementBase
(
Id (PK)
Type (FK to ElementType)
...
)
Run Code Online (Sandbox Code Playgroud)
(一对一的关系)
CREATE TABLE Element_A
(
Id (PK, FK to ElementBase)
...
)
CREATE TABLE Element_B
(
Id (PK, FK to ElementBase)
...
)
Run Code Online (Sandbox Code Playgroud)
1)RBAC(多对多关系)
CREATE TABLE ElementType_To_Role_Rights
(
RightId (PK)
RoleId (FK to Role)
ElementTypeId (FK to ElementType)
...
)
Run Code Online (Sandbox Code Playgroud)
2)DAC(多对多关系)
CREATE TABLE ElementBase_To_Actor_Rights
(
RightId (PK)
ElementBaseId (FK to ElementBase)
ActorId (FK to Actor)
...
)
CREATE TABLE Actor
(
Id (PK)
Name
)
CREATE TABLE User
(
Id (PK, FK to Actor)
Password
...
)
CREATE TABLE Role
(
Id (PK, FK to Actor)
...
)
Run Code Online (Sandbox Code Playgroud)
每个元素都有一个权限表,一旦添加元素,您就需要添加一个表。这将增加应用程序维护。
将所有内容放在一张表中的缺点是您可能会遇到扩展问题,但可以使用分区、物化视图和/或虚拟列来缓解这些问题。可能不需要此类措施。
至于表设计,如果这是在 Oracle 上,我可能会建议如下:
CREATE SEQUENCE UserRoleID;
CREATE TABLE USERROLE
(
USERID NUMBER(7) NOT NULL
, ROLEID NUMBER(7) NOT NULL
, CONSTRAINT USERROLE_PK PRIMARY KEY
(
USERID
, ROLEID
)
ENABLE
)
ORGANIZATION INDEX;
CREATE TABLE PERMISSIONS
(
ID NUMBER(7) NOT NULL
, ELEMENTID NUMBER(7) NOT NULL
, CONSTRAINT USERROLE_PK PRIMARY KEY
(
ID
, ELEMENTID
)
ENABLE
)
ORGANIZATION INDEX;
Run Code Online (Sandbox Code Playgroud)
包代码可以根据需要使用 UserRoleID 序列来填充用户表中的 Id 和角色表中的 Id。然后,权限表可以具有分配给角色的元素,这些角色又分配给用户和/或直接分配给用户的元素。