Datenbankmodell mit Benutzern, Rollen und Rechten

40

Ich habe ein Datenbankmodell mit einer Benutzertabelle und einer Rollentabelle. Ich möchte den Zugriff (Rechte) auf bis zu 10 verschiedene Elemente kontrollieren. Der Zugriff kann entweder einer Rolle oder einem einzelnen Benutzer gewährt werden. Nachfolgend finden Sie die Tabellendefinition von Benutzern, Rollen und Elementen:

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

...

Jetzt habe ich zwei verschiedene Möglichkeiten, die Rechte zu gestalten. Eine Tabelle mit einer Rechtetypspalte oder 10 Rechtetabellen - eine für jedes Element, auf das ich den Zugriff steuern möchte.

Was sind die Vor- und Nachteile einer Rechtetabelle gegenüber einer Rechtetabelle pro Element? - oder ist das geeigneter?

Taudorf
quelle
1
Haben Sie die ASP.NET-Benutzerdatenbank gesehen, die genau dies ausführt? (Wie ich verstehe, was Sie fragen, kann ich mich irren)
Jcolebrand

Antworten:

35

Welche Art von Sicherheitsmodell planen Sie zuallererst zu implementieren? Rollenbasierte Zugriffskontrolle (RBAC) oder diskretionäre Zugriffskontrolle (DAC)?

RBAC Im RBAC-Modell (Role-Based Access Control) basiert der Zugriff auf Ressourcen auf der einem Benutzer zugewiesenen Rolle. In diesem Modell weist ein Administrator einem Benutzer eine Rolle zu, die über bestimmte vordefinierte Rechte und Berechtigungen verfügt. Aufgrund der Zuordnung des Benutzers zur Rolle kann der Benutzer auf bestimmte Ressourcen zugreifen und bestimmte Aufgaben ausführen. RBAC wird auch als nicht diskretionäre Zugriffskontrolle bezeichnet. Die den Benutzern zugewiesenen Rollen werden zentral verwaltet.

DAC Im DAC-Modell (Discretionary Access Control) basiert der Zugriff auf Ressourcen auf der Identität des Benutzers. Einem Benutzer werden Berechtigungen für eine Ressource erteilt, indem er in eine der Ressource zugeordnete Zugriffssteuerungsliste (Access Control List, ACL) aufgenommen wird. Ein Eintrag in der ACL einer Ressource wird als Access Control Entry (ACE) bezeichnet. Wenn ein Benutzer (oder eine Gruppe) Eigentümer eines Objekts im DAC-Modell ist, kann der Benutzer anderen Benutzern und Gruppen Berechtigungen erteilen. Das DAC-Modell basiert auf dem Ressourcenbesitz.

siehe Quelle

1) In RBAC: Sie benötigen die ElementType-Tabelle, um Rollenberechtigungen zuzuweisen (Benutzer sind Rollen zugeordnet). RBAC definiert: "Was kann diese Rolle / dieser Benutzer tun". Der Administrator weist den Rollen Rechte und Berechtigungen zu, weist den Rollen Benutzer zu, die auf Ressourcen zugreifen sollen. 2) In DAC: Benutzer und Rollen haben Rechte an Elementen über die Zugriffssteuerungsliste (Eigentümer). DAC definiert: "Wer hat Zugriff auf meine Daten". Benutzer (Eigentümer) erteilt Berechtigungen für die besessene Ressource.

Wie auch immer, ich schlage folgendes Datenmodell vor:

CREATE TABLE ElementType
(
    Id (PK)
    Name
    ...
)

CREATE TABLE ElementBase
(
    Id (PK)
    Type (FK to ElementType)
    ...
)

(eins zu eins Beziehung)

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

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

1) RBAC (Viele-zu-Viele-Beziehung)

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

2) DAC (Viele-zu-Viele-Beziehung)

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)
    ...
)
Garik
quelle
1
Ist es eine gute Idee, nicht verwandte Element_xxx-Entitäten von ElementBase abzuleiten? Zum Beispiel muss ich die Zugangskontrolle für meine Produkte und meine Kunden verfolgen. Empfehlen Sie mir, eine generische ElementBase zu erstellen und element_base_id als Primärschlüssel für product_id und customer_id zu verwenden, auch wenn sie nicht in Beziehung stehen?
Parth Shah
1
RBAC gegen DAC, +1
Irfan
@ParthShah welchen Ansatz hast du für dein Problem gewählt?
Vivek Vardhan
5

Mit einer Rechtetabelle für jedes Element müssen Sie, sobald Sie ein Element hinzufügen, eine Tabelle hinzufügen. Dies würde zur Anwendungswartung beitragen.

Wenn Sie alles in einer Tabelle zusammenfassen, kann dies zu Problemen bei der Skalierung führen. Diese können jedoch durch Partitionierung, materialisierte Ansichten und / oder virtuelle Spalten verringert werden. Wahrscheinlich wären solche Maßnahmen nicht erforderlich.

In Bezug auf das Tabellendesign, wenn dies auf Oracle wäre, könnte ich Folgendes vorschlagen:

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;

Der Paketcode könnte die UserRoleID-Sequenz verwenden, um die ID in der Users-Tabelle und die ID in der Roles-Tabelle nach Bedarf zu füllen. Die Berechtigungstabelle kann dann Elemente enthalten, die Rollen zugewiesen sind, die wiederum Benutzern zugewiesen sind, und / oder Elemente, die Benutzern direkt zugewiesen sind.

Leigh Riffel
quelle