Entwerfen eines Benutzerauthentifizierungsmoduls (Rollen und Rechte)

15

Ich versuche, ein Benutzerauthentifizierungsmodul für eine MS SQL Server-Datenbank zu modellieren, das das Back-End einer Delphi-UI-Anwendung ist. Grundsätzlich möchte ich Benutzerkonten haben, bei denen der Benutzer nur einer Gruppe angehört. Eine Gruppe kann "n" Rechte haben.

Ich möchte der Datenbank auch einen Kennwortverlauf hinzufügen, da der Benutzer sein Kennwort basierend auf einer Anwendungseinstellung ändern muss (z. B. alle 90 Tage).

Ich möchte auch jedes Mal ein Ereignis protokollieren, wenn sich ein Benutzer an- und abmeldet. Ich kann dies in Zukunft auf weitere Veranstaltungen ausweiten.

Unten findest du meinen ersten Riss. Bitte teilen Sie mir Verbesserungsvorschläge mit, da dies mein erstes Mal ist.

Sehen Sie einen Bedarf an zusätzlichen Attributen für die rollenbasierte Sicherheit und Einschränkungen für die Kennwortregeln / Ablaufzeiträume?

DB-Design

Johnny Holmes
quelle
Ein detaillierter Blog ist hier: goo.gl/ATnj6j
Suresh Kamrushi
1
Ich verstehe etwas nicht. In der Benutzertabelle haben Sie die group_id. Kann eine Person Mitglied von mehr als einer Gruppe sein?
Johnny

Antworten:

11

Basierend auf Ihren angegebenen Anforderungen ist Ihr Modell in einem ziemlich guten Zustand.

Hier einige Verbesserungsvorschläge:

  • Sie sagen das nicht explizit, daher ist es schwer zu sagen - aber es sieht so aus, als würden Sie das Benutzerkennwort direkt speichern. Das wäre sehr schlimm! Wenn Sie sich gemeinsame Authentifizierungsdatenbanken ansehen, werden Kennwörter in verschlüsselter Form gespeichert. Sie sehen oft sowohl eine passwordSpalte als auch eine password_saltSpalte.

  • Ihre USER_LOGSTabelle hat eine EventSpalte. Sie sind sich nicht sicher, wie diese Daten ausgefüllt werden sollen. Sollte es eine EVENT_TYPETabelle geben, auf die USER_LOGSverwiesen wird? Dies könnte zu einer freundlicheren Berichterstattung führen. Typische Ereignisse sind Anmelden, Abmelden, Kennwortfehler, Kennwortänderung, Zurücksetzen des Kennworts, Sperren, Entsperren usw.

  • Ihre GROUP_RIGHTSTabelle gibt nicht an, wer die Rechte gewährt hat. Zu Audit-Trail-Zwecken wird häufig protokolliert, wer wann welche Aufzeichnungen geändert hat. Das könnte für Sie kein Problem sein.

Im Folgenden finden Sie einige Fragen zu Ihren angegebenen Geschäftsanforderungen, die sich in verschiedener Hinsicht vom rollenbasierten Sicherheitsmuster "Lehrbuch" unterscheiden:

  • Möchten Sie wirklich, dass Benutzer nur einer Gruppe angehören? Der Vorteil der rollenbasierten Sicherheit besteht darin, dass die Rollen in der Regel ziemlich statisch sind, während die Personen, die Rollen erfüllen, häufig ein- und ausgehen. Dazu gehört, dass manche Leute oft "zwei Hüte tragen".

  • Ihr Design ist nur förderfähig. Einige Systeme enthalten Erteilung und Widerruf . Dies erlaubt Ihnen zu sagen, dass ein weit verbreitetes Recht für eine bestimmte Gruppe nicht verfügbar ist.

  • Sie haben Benutzer und Konten wie USERSin Ihrem Entwurf festgelegt. Es wird häufig zwischen Personen und Benutzer-IDs unterschieden . Einige Benutzer-IDs sind für Teams oder Computer bestimmt, und einige Personen haben mehrere Benutzer-IDs für verschiedene Zwecke. Ist das eine Unterscheidung, die für Sie hilfreich wäre?

Joel Brown
quelle
3

Ich denke, bitweise Operatoren sind der beste Weg, um Benutzerrechte zu implementieren. Hier zeige ich, wie wir es mit MySQL implementieren können.

Unten finden Sie eine Beispieltabelle mit einigen Beispieldaten:

Tabelle 1 : Berechtigungstabelle zum Speichern des Berechtigungsnamens mit Bit wie 1,2,4,8..etc (Vielfaches von 2)

CREATE TABLE IF NOT EXISTS `permission` (
  `bit` int(11) NOT NULL,
  `name` varchar(50) NOT NULL,
  PRIMARY KEY (`bit`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Fügen Sie einige Beispieldaten in die Tabelle ein.

INSERT INTO `permission` (`bit`, `name`) VALUES
(1, 'User-Add'),
(2, 'User-Edit'),
(4, 'User-Delete'),
(8, 'User-View'),
(16, 'Blog-Add'),
(32, 'Blog-Edit'),
(64, 'Blog-Delete'),
(128, 'Blog-View');

Tabelle 2 : Benutzertabelle zum Speichern von Benutzer-ID, Name und Rolle. Die Rolle wird als Summe der Berechtigungen berechnet.
Beispiel:
Wenn der Benutzer 'Ketan' die Berechtigung 'User-Add' (Bit = 1) und 'Blog-Delete' (Bit-64) hat, ist die Rolle 65 (1 + 64).
Wenn der Benutzer 'Mehata' die Berechtigung 'Blog-View' (Bit = 128) und 'User-Delete' (Bit-4) hat, ist die Rolle 132 (128 + 4).

CREATE TABLE IF NOT EXISTS `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `role` int(11) NOT NULL,
  `created_date` datetime NOT NULL
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1;

Beispieldaten-

INSERT INTO `user` (`id`, `name`, `role`, `created_date`)
   VALUES (NULL, 'Ketan', '65', '2013-01-09 00:00:00'),
   (NULL, 'Mehata', '132', '2013-01-09 00:00:00');

Hinterlegen der Berechtigung des Benutzers Wenn wir nach dem Login die Benutzerberechtigung laden möchten, können wir unten nachfragen, um die Berechtigungen zu erhalten:

SELECT permission.bit,permission.name  
   FROM user LEFT JOIN permission ON user.role & permission.bit
 WHERE user.id = 1

Hier ist user.role "&" permission.bit ein Bitwise-Operator, der die Ausgabe als - ausgibt.

User-Add - 1
Blog-Delete - 64

Wenn wir das Wetter überprüfen möchten, hat ein bestimmter Benutzer die Berechtigung zum Bearbeiten des Benutzers oder nicht.

  SELECT * FROM `user` 
     WHERE role & (select bit from permission where name='user-edit')

Ausgabe = Keine Zeilen.

Sie können auch sehen: http://goo.gl/ATnj6j

Suresh Kamrushi
quelle
Und was machen wir, wenn die Berechtigungen zahlreich sind, beispielsweise 100?
ypercubeᵀᴹ
2
Sie haben 3 identische Antworten gepostet - auf verschiedene Fragen! -, alle heute mit ein paar Minuten Abstand gepostet. Dies ist keine gute Praxis. Wenn Sie der Meinung sind, dass die Fragen identisch oder ähnlich genug sind, können Sie abstimmen, um sie als Duplikate zu schließen (oder sie markieren, wenn Sie nicht über den Ruf verfügen, für das Schließen zu stimmen).
Ypercubeᵀᴹ
Bitte bearbeite auch deinen Link und erkläre, was er hat (mehr Details, ist es dein Blog oder eines anderen, etc.?)
ypercubeᵀᴹ
Bitte kopieren und fügen Sie nicht dieselbe Antwort ein, sondern verteilen Sie sie auf eine Reihe alter Fragen. Wenn diese Fragen identisch sind, kennzeichnen Sie sie als Duplikate.
Aaron Bertrand