Frage

Was wäre eine ideale Struktur für Benutzer> Berechtigungen von Objekten sein.

Ich habe für allgemeine Berechtigungen viele ähnliche Beiträge gesehen, oder welche Abschnitte kann ein Benutzer den Zugriff, die aus einem users, userGroups und userGroupRelations oder etwas dieser Art besteht.

In meinem System gibt es viele verschiedene Objekte, die erstellt bekommen können, und jeder hat können ein- oder ausgeschaltet werden. Zum Beispiel, ein Passwort-Manager übernehmen, die Gruppen und Untergruppen hat.

Group 1
    Group 2
    Group 3
    Group 4
Group 5
   Group 6
Group 7
   Group 8
       Group 9
       Group 10

Jede Gruppe kann eine Reihe von Passwörtern enthalten. Ein Benutzer kann zu einer Gruppe gegeben Lesen, Schreiben, Bearbeiten und Löschen von Berechtigungen. Weitere Gruppen können an jedem beliebigen Punkt in der Zeit erstellt bekommen.

Wenn jemand die Erlaubnis zu einer Gruppe hat, sollte ich in der Lage sein, ihm Berechtigungen für alle Untergruppen zu machen oder einzuschränken, es nur diese Gruppe.

Mein aktueller Gedanke ist eine Benutzer-Tabelle zu haben, und dann eine Berechtigungstabelle mit Spalten wie:

permission_id (int) PRIMARY_KEY
user_id (int) INDEX
object_id (int) INDEX
type (varchar) INDEX
admin (bool)
read (bool)
write (bool)
edit (bool)
delete (bool)

Dies hat in der Vergangenheit zusammengearbeitet, aber das neue System, das ich Bedürfnis baue die Lage sein, schnell zu skalieren, und ich bin nicht sicher, ob dies die beste Struktur ist. Es macht auch die Idee, dass jemand mit allen Untergruppe Berechtigungen einer Gruppe schwieriger ist.

Es wird eine separate Tabelle für Rollen von Benutzern / Administratoren sein, dh sie können die Berechtigungen für Benutzer unter Gruppen ändern sie steuern können.

So, als eine Frage, soll ich mit der obigen Struktur verwenden? Oder kann jemand Punkt mich in die Richtung eines besseren?


EDIT

Alternative ist es, eine Permission-Tabelle für jede Art von Objekt zu erstellen.

War es hilfreich?

Lösung

Ich schlage vor, Sie ein „last_update“ Zeitstempel hinzufügen und eine „last_updated_by_user“ Spalte, so dass Sie eine gewisse Hoffnung von Tracking Änderungen an dieser Tabelle in Ihrem laufenden System haben.

Sie könnten erwägen eine Genehmigung Zugabe - Zuschuss. Ein Nutzer kann die Erteilung Erlaubnis für ein Objekt mit der Lage wäre, den Zugriff auf andere Benutzer auf das betreffende Objekt zu gewähren.

Seien Sie vorsichtig mit „Bedürfnisse schnell zu skalieren.“ Es ist schwer, ohne die Produktion Erfahrung der realen Welt zu erraten, was für ein Scale-Up-System wirklich braucht.

Seien Sie auch vorsichtig nicht ein Berechtigungssystem über komplizieren, weil ein zu komplexes System nur schwer zu verifizieren und daher leichter zu knacken. Ein einfaches System wird viel einfacher zu refactor für Scale-up als ein komplexeres.

Ihr Schema scheint Benutzer auf Objekte zu beziehen. Wollen Sie Ihre Primärschlüssel und Ihre eindeutigen Index sein (user_id, object_id)? Das heißt, tun Sie jeden Benutzer mögen für jedes Objekt entweder Null oder einen Berechtigungseintrag haben? Wenn ja, den Primärschlüssel verwenden, das zu erzwingen, anstatt mit dem Ersatzschlüssel permission_id vorschlagen.

Für Ihre Objekte, die in Hierarchien existieren, sollten Sie eine von zwei Entscheidungen treffen system:

  1. ein Zuschuss zu einem Objekt mit Subobjekte implizit gewährt nur Zugriff auf die Objekt oder ...

  2. es gewährt auch Zugang auf alle Subobjekte.

Die zweite Wahl reduziert die Last der ausdrücklichen Erlaubnis gewähren, wenn neue Teilobjekte erstellt werden. Die erste Wahl ist sicherer.

Die zweite Wahl macht es schwieriger, zu bestimmen, ob ein Benutzer Zugriff auf ein bestimmtes Objekt hat, weil Sie die Objekthierarchie in Richtung auf die Wurzel des Baumes für den Zugriff gewährt auf Elternobjekte suchen gehen, wenn die Überprüfung, ob ein Benutzer Zugriff hat. Das Leistungsproblem sollte Ihre Entscheidungsfindung beherrscht. Werden Ihre Benutzer sie oft ein paar Objekte und Zugang zu schaffen? Oder werden sie sie selten viele Objekte und Unterobjekte und Zugang schaffen? Wenn der Zugriff häufiger als Schöpfung ist, möchten Sie die erste Wahl. Nehmen Sie die Erlaubnis erfüllende Kopftreffer bei der Erzeugung der Objekte, sondern als ein permission-Suche Treffer auf Objektzugriffszeit.

Ich denke, die erste Wahl wahrscheinlich überlegen ist. Ich schlage vor, dieses Tabellenlayout:

user_id (int)
object_id (int)
type (varchar)  (not sure what you have this column for)
admin (bool)
read (bool)
write (bool)
edit (bool)
grant (bool)
delete (bool)
last_update (timestamp)
last_updated_by_user_id (int)
primary key = user_id, object_id.

Sie können auch diese Tabellen-Layout verwenden und haben eine Zeile in der Tabelle für jede einzelne jeden Benutzer der Erlaubnis für jedes Objekt. Diese eine Waage bis leichter, wenn Sie mehr Arten von Berechtigungen hinzufügen.

user_id (int)
object_id (int)
permission_enum (admin/read/write/edit/grant/delete)
type (varchar)  (not sure what you have this column for)
last_update (timestamp)
last_updated_by_user_id (int)
primary key = user_id, object_id, permission_enum
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top