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


40

我有一个带有用户表和角色表的数据库模型。我想控制对多达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,
  ...
);

...

现在,我有两种不同的设计权利的方法。一个具有权限类型列的表或10个权限表-我要控制对每个元素的访问权限的表。

每个元素一个权限表与一个权限表的优缺点是什么?-还是更合适的方法?


1
您看到过执行此操作的ASP.NET用户数据库吗?(据我所知,您可能会问错,)
jcolebrand

Answers:


35

首先,您打算实施哪种类型的安全模型?基于角色的访问控制(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)
    ...
)

(一对一关系)

CREATE TABLE Element_A
(
    Id (PK, FK to ElementBase)
    ...
)

CREATE TABLE Element_B
(
    Id (PK, FK to ElementBase)
    ...
)

1)RBAC(多对多关系)

CREATE TABLE ElementType_To_Role_Rights
(
    RightId (PK)
    RoleId  (FK to Role)
    ElementTypeId (FK to ElementType)
    ...
)

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)
    ...
)

1
使不相关的Element_xxx实体派生自ElementBase是一个好主意吗?例如,我需要跟踪我的产品和客户的访问控制。您是否建议我创建一个通用的ElementBase并让element_base_id作为product_id和customer_id的主键,即使它们不相关?
Parth Shah 2015年

1
RBAC与DAC,+ 1
Irfan

@ParthShah解决问题的方法是什么?
Vivek Vardhan

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;

程序包代码可以根据需要使用UserRoleID序列填充“用户”表中的ID和“角色”表中的ID。权限表然后可以具有分配给角色的元素,这些元素又分配给用户和/或具有直接分配给用户的元素。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.