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?
database-design
best-practices
Taudorf
quelle
quelle
Antworten:
Welche Art von Sicherheitsmodell planen Sie zuallererst zu implementieren? Rollenbasierte Zugriffskontrolle (RBAC) oder diskretionäre Zugriffskontrolle (DAC)?
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:
(eins zu eins Beziehung)
1) RBAC (Viele-zu-Viele-Beziehung)
2) DAC (Viele-zu-Viele-Beziehung)
quelle
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:
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.
quelle