sql >> Database >  >> RDS >> Mysql

Gids voor het ontwerpen van een database voor RBAC in MySQL

Deze zelfstudie biedt volledige stappen voor het ontwerpen van een databaseschema van een Role-Based Access Control (RBAC)-systeem om de gebruikers, rollen en machtigingen te beheren. Het kan verder worden gebruikt om de toegang tot specifieke bronnen te beslissen op basis van specifieke machtigingen. Het gebruik van een RBAC-systeem moet worden beschouwd als een integraal onderdeel van elke toepassing die de bronnen deelt met meerdere gebruikers. bijv. de medewerkers van een organisatie kunnen de producten openen of beheren op basis van de aan hen toegewezen machtigingen. Idealiter kunnen de rechten worden toegewezen via rollen.

Het entiteitsrelatiediagram of visueel databaseontwerp wordt hieronder weergegeven.

Afb. 1

Opmerkingen :De rol- en machtigingstabellen die in deze tutorial worden besproken, kunnen worden toegevoegd aan de applicatiedatabases die worden besproken in de tutorials Blog en Poll &Survey. Deze tutorial gaat ervan uit dat de machtigingen hard gecodeerd zijn op codeniveau om de toegang te controleren.

U kunt ook de populaire tutorials bezoeken, waaronder MySQL 8 installeren op Ubuntu, MySQL 8 installeren op Windows, Blog Database in MySql, Poll en Survey Database in MySql en Basic SQL Queries leren in MySQL.

RBAC-database

De allereerste stap is het maken van de RBAC-database. Het kan worden gemaakt met behulp van de onderstaande query.

CREATE SCHEMA `rbac` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Ik heb de tekenset utf8mb4 . gebruikt om een ​​breed scala aan karakters te ondersteunen.

Gebruikerstabel

In deze sectie zullen we de Gebruikerstabel . ontwerpen om gebruikersinformatie op te slaan. Hieronder staat de beschrijving van alle kolommen van de gebruikerstabel.

Id Het unieke ID om de gebruiker te identificeren.
Voornaam De voornaam van de gebruiker.
Middelste naam De middelste naam van de gebruiker.
Achternaam De achternaam van de gebruiker.
Mobiel Het mobiele nummer van de gebruiker. Het kan worden gebruikt voor aanmeldings- en registratiedoeleinden.
E-mail Het e-mailadres van de gebruiker. Het kan worden gebruikt voor aanmeldings- en registratiedoeleinden.
Wachtwoordhash De wachtwoord-hash gegenereerd door het juiste algoritme. We moeten vermijden om gewone wachtwoorden op te slaan.
Geregistreerd bij Deze kolom kan worden gebruikt om de levensduur van de gebruiker met de applicatie te berekenen.
Laatste aanmelding Het kan worden gebruikt om de laatste login van de gebruiker te identificeren.
Inleiding De korte introductie van de gebruiker.
Profiel De gebruikersgegevens.

De gebruikerstabel met de juiste beperkingen is zoals hieronder weergegeven.

CREATE TABLE `rbac`.`user` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`firstName` VARCHAR(50) NULL DEFAULT NULL,
`middleName` VARCHAR(50) NULL DEFAULT NULL,
`lastName` VARCHAR(50) NULL DEFAULT NULL,
`mobile` VARCHAR(15) NULL,
`email` VARCHAR(50) NULL,
`passwordHash` VARCHAR(32) NOT NULL,
`registeredAt` DATETIME NOT NULL,
`lastLogin` DATETIME NULL DEFAULT NULL,
`intro` TINYTEXT NULL DEFAULT NULL,
`profile` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `uq_mobile` (`mobile` ASC),
UNIQUE INDEX `uq_email` (`email` ASC) );

Roltabel

In deze sectie zullen we de Rollentabel . ontwerpen om de systeemrollen op te slaan. Hieronder staat de beschrijving van alle kolommen van de Rollentabel.

Id Het unieke ID om de rol te identificeren.
Titel De roltitel.
Naaktslak De unieke slug om de rol te doorzoeken.
Beschrijving De beschrijving om de rol te vermelden.
Actief De vlag om te controleren of de rol momenteel actief is.
Gemaakt op Het slaat de datum en tijd op waarop de rol is aangemaakt.
Bijgewerkt om Het slaat de datum en tijd op waarop de rol is bijgewerkt.
Inhoud De volledige details over de rol.

De rollentabel met de juiste beperkingen is zoals hieronder weergegeven.

CREATE TABLE `rbac`.`role` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`title` VARCHAR(75) NOT NULL,
`slug` VARCHAR(100) NOT NULL,
`description` TINYTEXT NULL,
`active` TINYINT(1) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `uq_slug` (`slug` ASC) );

Toestemmingstabel

In deze sectie zullen we de Toestemmingstabel . ontwerpen om de systeemrechten op te slaan. Hieronder staat de beschrijving van alle kolommen van de machtigingstabel.

Id Het unieke ID om de toestemming te identificeren.
Titel De toestemmingstitel.
Naaktslak De unieke slug om de toestemming te doorzoeken.
Beschrijving De beschrijving om de toestemming te vermelden.
Actief De vlag om te controleren of de toestemming momenteel actief is.
Gemaakt op Het slaat de datum en tijd op waarop de toestemming is gemaakt.
Bijgewerkt om Het slaat de datum en tijd op waarop de toestemming is bijgewerkt.
Inhoud De volledige details over de toestemming.

De machtigingentabel met de juiste beperkingen is zoals hieronder weergegeven.

CREATE TABLE `rbac`.`permission` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`title` VARCHAR(75) NOT NULL,
`slug` VARCHAR(100) NOT NULL,
`description` TINYTEXT NULL,
`active` TINYINT(1) NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `uq_slug` (`slug` ASC) );

Rolmachtigingstabel

De Rolmachtigingstabel kan worden gebruikt om de toewijzingen van de machtigingen voor de rollen op te slaan. Hieronder vindt u de beschrijving van alle kolommen van de Rolmachtigingstabel.

Rol-ID De rol-ID om de rol te identificeren.
Toestemmings-ID De machtigings-ID om de machtiging te identificeren.
Gemaakt op Het slaat de datum en tijd op waarop de toewijzing is gemaakt.
Bijgewerkt om Het slaat de datum en tijd op waarop de toewijzing is bijgewerkt.

De roltoestemmingstabel met de juiste beperkingen is zoals hieronder weergegeven.

CREATE TABLE `rbac`.`role_permission` (
`roleId` BIGINT NOT NULL,
`permissionId` BIGINT NOT NULL,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL,
PRIMARY KEY (`roleId`, `permissionId`),
INDEX `idx_rp_role` (`roleId` ASC),
INDEX `idx_rp_permission` (`permissionId` ASC),
CONSTRAINT `fk_rp_role`
FOREIGN KEY (`roleId`)
REFERENCES `rbac`.`role` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_rp_permission`
FOREIGN KEY (`permissionId`)
REFERENCES `rbac`.`permission` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);

Gebruikersrol

We kunnen het systeem eenvoudig houden door een enkele rol toe te kennen aan de gebruiker. De toegewezen rol kan worden gebruikt om de machtigingen op te halen die aan de rol zijn toegewezen. De toegang tot de specifieke bron of machtiging kan worden gecontroleerd door de hardgecodeerde machtiging te vergelijken met de lijst met machtigingen die zijn toegewezen aan de rol die aan de gebruiker is toegewezen.

Het kan worden gedaan met behulp van de onderstaande query.

ALTER TABLE `rbac`.`user` 
ADD COLUMN `roleId` BIGINT NOT NULL AFTER `id`,
ADD INDEX `idx_user_role` (`roleId` ASC);

ALTER TABLE `rbac`.`user`
ADD CONSTRAINT `fk_user_role`
FOREIGN KEY (`roleId`)
REFERENCES `rbac`.`role` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

Geavanceerde opties

Men kan denken aan het toekennen van meerdere rollen aan de gebruiker met behulp van de Gebruikersrollentabel. De meer geavanceerde opties omvatten het hiërarchiesysteem om de machtigingen of rollen te groeperen. Deze opties bemoeilijken de query om de lijst met machtigingen op te halen, en moeten daarom worden geoptimaliseerd door een geschikt cachemechanisme te hebben.

Samenvatting

In deze zelfstudie hebben we het databaseontwerp van een RBAC-systeem besproken om specifieke verzoeken en bronnen te beveiligen door alleen toegang toe te staan ​​als de gebruiker de juiste toestemming heeft.

U kunt uw opmerkingen indienen om deel te nemen aan de discussie. Mogelijk bent u ook geïnteresseerd in het ontwerpen van de database van de toepassingen Blog en Poll &Survey.

Het volledige databaseschema is ook beschikbaar op GitHub.


  1. Standaard MySQL-tekenset wijzigen in UTF-8 in my.cnf?

  2. Oracle-schemagebruiker kan geen tabel maken in procedure

  3. Hoe wijzig ik het gegevenstype voor een kolom in MySQL?

  4. Waarom u de gebruikerstoegang voor uw database moet beperken