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. |
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.