具有用户、角色和权限的数据库模型

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)

  • 让不相关的 Element_xxx 实体从 ElementBase 派生是一个好主意吗?例如,我需要跟踪我的产品和客户的访问控制。您是否建议我创建一个通用的 ElementBase 并让 element_base_id 成为 Product_id 和 customer_id 的主键,即使它们不相关? (2认同)

Lei*_*fel 5

每个元素都有一个权限表,一旦添加元素,您就需要添加一个表。这将增加应用程序维护。

将所有内容放在一张表中的缺点是您可能会遇到扩展问题,但可以使用分区、物化视图和/或虚拟列来缓解这些问题。可能不需要此类措施。

至于表设计,如果这是在 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。然后,权限表可以具有分配给角色的元素,这些角色又分配给用户和/或直接分配给用户的元素。