it-swarm.com.de

Entwerfen eines Benutzerauthentifizierungsmoduls (Rollen und Rechte)

Ich versuche, ein Benutzerauthentifizierungsmodul für eine MS SQL Server-Datenbank zu modellieren, die das Back-End einer Delphi-UI-Anwendung darstellt. 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 ein Ereignis für jedes Mal protokollieren, wenn sich ein Benutzer an- und abmeldet. Ich kann dies in Zukunft auf weitere Ereignisse ausweiten.

Unten findest du meinen ersten Riss. Bitte teilen Sie mir Verbesserungsvorschläge mit, da ich dies zum ersten Mal mache.

Sehen Sie zusätzliche Attribute für die rollenbasierte Sicherheit und Einschränkungen für die Kennwortregeln/Ablaufzeiträume?

db-design

15
Johnny Holmes

Aufgrund Ihrer angegebenen Anforderungen ist Ihr Modell in einem recht guten Zustand.

Hier einige Verbesserungsvorschläge:

  • Sie sagen dies nicht explizit, daher ist es schwer zu sagen - aber es sieht so aus, als würden Sie das Benutzerkennwort direkt speichern. Dies wäre sehr schlecht! Wenn Sie sich gängige Authentifizierungsdatenbanken ansehen, werden Kennwörter in verschlüsselter Form gespeichert. Sie sehen häufig sowohl eine password -Spalte als auch eine password_salt - Spalte.

  • Ihre USER_LOGS - Tabelle enthält eine Event -Spalte. Sie sind sich nicht sicher, wie dies ausgefüllt werden soll. Sollte es eine EVENT_TYPE - Tabelle geben, auf die USER_LOGS Verweist? Dies kann zu einer benutzerfreundlicheren Berichterstattung führen. Typische Ereignisse sind Anmelden, Abmelden, Kennwortfehler, Kennwortänderung, Zurücksetzen des Kennworts, Sperren, Entsperren, ...

  • Ihre GROUP_RIGHTS - Tabelle gibt nicht an, wer die Rechte gewährt hat. Für Audit-Trail-Zwecke führen Personen häufig ein Protokoll darüber, wer wann welche Aufzeichnungen geändert hat. Das ist möglicherweise kein Problem für Sie.

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

  • Sind Sie sicher, dass Benutzer nur einer Gruppe angehören sollen? 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 kommen und gehen. Darin enthalten ist, dass manche Leute oft "zwei Hüte tragen".

  • Ihr Design ist nur für Zuschüsse. Einige Systeme umfassen grant und widerrufen. Auf diese Weise können Sie sagen, dass ein allgemein verfügbares Recht einer bestimmten Gruppe nicht zur Verfügung steht.

  • Sie haben Benutzer und Konten in Ihrem Design als USERS. Es gibt oft einen Unterschied zwischen Benutzer-IDs und . Einige Benutzer-IDs sind für Teams oder Maschinen bestimmt, und einige Personen haben mehrere Benutzer-IDs für unterschiedliche Zwecke. Ist dies eine Unterscheidung, die für Sie hilfreich wäre?

11
Joel Brown

Ich denke, bitweise Operatoren sind der beste Weg, um Benutzerberechtigungen 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 zusammen mit diesem 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 Benutzer 'Ketan' die Berechtigung 'Benutzer hinzufügen' (Bit = 1) und 'Blog löschen' (Bit-64) hat, beträgt die Rolle 65 (1 + 64).
Wenn 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');

Loding-Berechtigung des Benutzers Wenn Sie nach der Anmeldung die Benutzerberechtigung laden möchten, können Sie 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 "&" allow.bit ein bitweiser 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

3
Suresh Kamrushi