Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Best Practice für die Gestaltung von Benutzerrollen und Berechtigungssystemen?

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

Nachfolgend finden Sie eine Beispieltabelle mit einigen Beispieldaten:

Tabelle 1 :Berechtigungstabelle zum Speichern des Berechtigungsnamens zusammen mit Bits wie 1, 2, 4, 8 usw. (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, ist die Rolle 65 (1+64).
Wenn Benutzer 'Mehata' die Berechtigung hat Erlaubnis von 'Blog-View' (Bit=128) und 'User-Delete' (Bit-4), also 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 permission of userNach der Anmeldung, wenn wir die Benutzerberechtigung laden möchten, können wir unten abfragen, 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 -

liefert
User-Add - 1
Blog-Delete - 64

Ob wir prüfen wollen, ob ein bestimmter Benutzer die Berechtigung zum Bearbeiten des Benutzers hat oder nicht-

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

Ausgabe =Keine Zeilen.

Sie können auch sehen:http://sforsuresh .in/implementation-of-user-permission-with-php-mysql-bitwise-operators/