Was ist ein Grundmodell für die Erstellung einer Datenbank mit Benutzern und Gruppen?

9

Ich versuche, den besten Weg für ein grundlegendes Sicherheitssystem für eine Website zu finden. Ich weiß, ich möchte Benutzer und Gruppen.

Ich dachte ich hätte:

user_table
user_id
user_name
...

group_type
group_id
group_name
parent_id
...

group_table
id
user_id
group_id

Der erste ist der Benutzer, der zweite ist die Gruppe und der dritte ist die Zwischentabelle, die die beiden verbindet. Ein Benutzer hat viele Gruppen.

Klingt das in Ordnung?

Johnny
quelle
Andere als die Namen. Ihre GROUP_TYPETabelle sollte einen Namen GROUPoder ähnliches haben und Sie GROUP_TABLEsollten sowohl auf Benutzer als auch auf Gruppen verweisen, da dies die Verknüpfung ist.
Adam Musch
@adam macht group_table das nicht mit user_id und group_id?
Johnny
4
@AdamMusch Es sollte nicht GROUP heißen, da dies ein reserviertes Wort ist. Tabellen und Spalten sollten niemals nach reservierten Wörtern benannt werden
Philᵀᴹ
1
@Phil stimmte zu. Sie können auch eine Tabelle SELECTund ein Feld benennen, FROMdamit Sie eine Abfrage wieSELECT [FROM] FROM [SELECT]
JNK
2
Versuchen Sie, die Basisentitäten so etwas wie 'app_user' und 'app_role' aufzurufen
ConcernedOfTunbridgeWells

Antworten:

17

Die traditionelle Methode, dies zu modellieren, ist die Verwendung eines Musters namens rollenbasierte Sicherheit .

Die Idee ist nicht nur, Benutzergruppen zu haben, sondern auch Gruppen von Berechtigungen. So sieht das Muster aus:

Rollenbasierte Sicherheit ERD

Beachten Sie, dass Sie reservierte Wörter für Tabellennamen vermeiden möchten. Benennen Sie Ihre Tabellen daher nicht genau so, wie im Diagramm gezeigt.

So funktioniert es: Ihren Gruppen oder Rollen ist nicht nur eine Liste der ihnen zugewiesenen Benutzer, sondern auch eine Liste der ihnen zugewiesenen Berechtigungen. Auf diese Weise können Sie beide steuern, wer was kann, aber auch, was sie können, wenn Sie mir folgen.

Joel Brown
quelle
Aber was ist, wenn mein Benutzer eine Rolle wie Manager oder was auch immer hat und aus irgendeinem Grund derselbe Benutzer auch eine bestimmte Berechtigung benötigt (die weder in dieser Rolle noch in einer anderen Rolle allein ist)?
Levi
@levi - Wenn das passiert, besteht eine Möglichkeit, damit umzugehen, darin, eine spezielle Rolle wie "Bob's Special Permissions" zu übernehmen , was ein bisschen kludge ist, aber das Problem löst, solange Sie nicht zu viele Ausnahmen wie haben Dies. Es ist möglich, dass das, was Sie für eine individuelle Ausnahme halten, tatsächlich eine subtile neue Rolle ist, die Sie nicht berücksichtigt haben. Was passiert, wenn Bob aufgibt? Benötigt Bobs Ersatz auch diese außergewöhnliche Erlaubnis? Wenn ja, dann haben Sie tatsächlich eine Rolle mit einem Mitglied, keine Ausnahme.
Joel Brown
@levi - Eine andere Möglichkeit ist, dass Sie wirklich eine Mischung aus individuellen und Rollenrechten benötigen. In diesem Fall kann Ihre ROLETabelle in Einzel- und Gruppentypen unterteilt werden, wobei der Gruppentyp null bis viele Mitglieder und der Einzeltyp genau ein Mitglied hat. Wie Sie diese Kardinalitätsregeln durchsetzen, liegt bei Ihnen. Dies kann deklarativ in Ihrem Datenbankschema erfolgen. In diesem Fall müssen Sie das abgebildete Schema geringfügig ändern. Oder Sie verwenden möglicherweise die Anwendungslogik. In diesem Fall sieht Ihr Schema immer noch so aus, wie ich es mir oben vorgestellt habe.
Joel Brown