sql >> Databasteknik >  >> RDS >> Mysql

Bästa praxis för att designa användarroller och behörighetssystem?

Jag tror att bitvis operatör är det bästa sättet att implementera användarbehörighet. Här visar jag hur vi kan implementera det med MySQL.

Nedan är ett exempel på tabeller med några exempeldata:

Tabell 1 :Behörighetstabell för att lagra behörighetsnamn tillsammans med den bit som 1, 2, 4, 8.. etc (multipel av 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;

Infoga några exempeldata i tabellen.

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

Tabell 2 :Användartabell för att lagra användar-id, namn och roll. Roll kommer att beräknas som summan av behörigheter.
Exempel:

Om användaren 'Ketan' har behörighet för 'User-Add' (bit=1) och 'Blog-Delete' (bit-64) så kommer rollen att vara 65 (1+64).
Om användaren 'Mehata' har behörighet för 'Blog-View' (bit=128) och 'User-Delete' (bit-4) så rollen kommer att vara 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;

Exempeldata-

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

Laddar behörighet för användare Efter inloggning om vi vill ladda användarbehörighet kan vi fråga nedan för att få behörigheterna:

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

Här är user.role "&" permission.bit en Bitwise-operator som ger utdata som -

User-Add - 1
Blog-Delete - 64

Om vi ​​vill kontrollera vädret har en viss användare behörighet för användarredigering eller inte-

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

Utdata =Inga rader.

Du kan också se:http://sforsuresh .in/implementation-of-user-permission-with-php-mysql-bitwise-operators/



  1. Sparar kapslade JSON-data i en MySQL-databas med Hibernate

  2. Byta namn på kolumner med främmande nyckel i MySQL

  3. Skaffa språket som för närvarande används i SQL Server

  4. LAST_INSERT_ID() returnerar alltid 0 (RMySQL) - separat anslutningsproblem