sql >> Database >  >> RDS >> Mysql

Best practice voor het ontwerpen van gebruikersrollen en machtigingssysteem?

Ik denk dat een bitsgewijze operator de beste manier is om gebruikerstoestemming te implementeren. Hier laat ik zien hoe we dit kunnen implementeren met MySQL.

Hieronder vindt u een voorbeeldtabellen met enkele voorbeeldgegevens:

Tabel 1 :Permissietabel om de machtigingsnaam samen met het op te slaan, zoals 1, 2, 4, 8.. etc (veelvoud van 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;

Voeg enkele voorbeeldgegevens in de tabel in.

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');

Tabel 2 :Gebruikerstabel om gebruikers-ID, naam en rol op te slaan. De rol wordt berekend als de som van de rechten.
Voorbeeld:

Als gebruiker 'Ketan' toestemming heeft voor 'User-Add' (bit=1) en 'Blog-Delete' (bit-64), is de rol 65 (1+64).
Als gebruiker 'Mehata' toestemming van 'Blog-View' (bit=128) en 'User-Delete' (bit-4), dus rol zal 132 (128+4) zijn.

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;

Voorbeeldgegevens-

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');

Toestemming van gebruiker ladenNa inloggen als we de gebruikerstoestemming willen laden, kunnen we hieronder vragen om de toestemmingen te krijgen:

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

Hier is user.role "&" permission.bit een Bitwise-operator die uitvoer geeft als -

User-Add - 1
Blog-Delete - 64

Als we willen controleren of een bepaalde gebruiker toestemming heeft om de gebruiker te bewerken of niet-

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

Uitvoer =Geen rijen.

U kunt ook zien:http://sforsuresh .in/implemention-of-user-permission-with-php-mysql-bitwise-operators/



  1. ROW_NUMBER in SQL – Selecteer Topvoorbeeld in SQL en SQL Server

  2. SELECTEER DISTINCT op één kolom

  3. GRADEN() Voorbeelden in SQL Server

  4. Hoe TIMESTAMP() werkt in MariaDB