角色和权限的“正确设计”模式会是什么样子?

Ele*_*ing 2 schema postgresql database-design

我正在创建一个与 Discord 具有类似角色和权限系统的应用程序。

基本上

  • 用户是组的成员
  • 组有角色
  • 角色有权限
  • 用户一次可以与一个角色关联。

我不知道如何设计这样的系统。最初,我想我应该有一个roles表,对于每个权限都会有一个布尔列,例如:can_change_nickname

但这似乎不太正确...

如果您有任何推荐的读物,或者可以提供详细说明为什么这样做的答案,我将非常感激。

  • AUSER是 1 个或多个的成员GROUPS
  • AGROUP可以有 1 个或多个ROLES
  • AROLE可以有 1 个或多个PERMISSIONS
  • AUSER只能PERMISSION通过将 aROLE与这些 一起分配来获得PERMISSIONS
  • 每个人都GROUP将根据应用程序提供的功能和内容类型共享通用权限
  • 不同的ROLES可以共享相同的PERMISSIONS

所以看起来我需要一个角色和权限的表。现在我只需要找到PERMISSIONS表格的样子。

Len*_*art 5

让我们从组开始。一般来说,我使用复数作为表名,除非有一个有效的集体名词。您可能有不同的偏好。

CREATE TABLE GROUPS
( GROUP_ID ... NOT NULL PRIMARY KEY
, ... ) ;
Run Code Online (Sandbox Code Playgroud)

由于一个用户可以是多个组的成员(并且我假设一个组可以包含多个用户),因此我们需要一个 nn 关系。这通常是通过连接表实现的:

CREATE TABLE USERS
( USER_ID ... NOT NULL PRIMARY KEY
, ... ) ;

CREATE TABLE USER_GROUPS
( USER_ID ... NOT NULL
      REFERENCES USERS (USER_ID)
, GROUP_ID ... NOT NULL
      REFERENCES GROUPS (GROUP_ID)
,   PRIMARY KEY (USER_ID, GROUP_ID)
);
Run Code Online (Sandbox Code Playgroud)

接下来我们有权限:

CREATE TABLE PERMISSIONS
( PERMISSION_ID ... NOT NULL PRIMARY KEY
, ...
);
Run Code Online (Sandbox Code Playgroud)

由于一个权限可以存在多个角色,因此我们再次使用 nn 关系表:

CREATE TABLE ROLES
( ROLE_ID ... NOT NULL PRIMARY KEY
, ...);

CREATE TABLE ROLE_PERMISSIONS
( ROLE_ID ... NOT NULL
      REFERENCES ROLES (ROLE_ID)
, PERMISSION_ID ... NOT NULL   
      REFERENCES PERMISSIONS (PERMISSION_ID)
,   PRIMARY KEY (ROLE_ID, PERMISSION_ID)
);
Run Code Online (Sandbox Code Playgroud)

最后我们可以描述组和角色之间的关系。如果我没猜错的话,这又是一个 nn 关系:

CREATE TABLE GROUP_ROLES
( ROLE_ID ... NOT NULL
      REFERENCES ROLES (ROLE_ID)
, GROUP_ID ... NOT NULL   
      REFERENCES GROUPS (GROUP_ID)
,   PRIMARY KEY (ROLE_ID, GROUP_ID)
);
Run Code Online (Sandbox Code Playgroud)

这当然只是一个草图。我盲目发明了属性名称,如果现实中存在属性名称,就使用它..