Denna handledning innehåller fullständiga steg för att utforma ett databasschema för ett rollbaserat åtkomstkontrollsystem (RBAC) för att hantera användare, roller och behörigheter. Den kan vidare användas för att bestämma åtkomst till specifika resurser baserat på specifika behörigheter. Att använda ett RBAC-system bör betraktas som en integrerad del av alla program som delar resurserna mellan flera användare. T.ex. de anställda i en organisation kan komma åt eller hantera produkterna baserat på de behörigheter som tilldelats dem. Helst kan behörigheterna tilldelas via roller.
Entity Relationship Diagram eller visuell databasdesign visas nedan.
Fig 1
Anteckningar :Roll- och behörighetstabellerna som diskuteras i den här självstudien kan läggas till i applikationsdatabaserna som diskuteras i självstudierna för blogg och omröstning och undersökning. Den här handledningen förutsätter att behörigheterna är hårdkodade på kodnivå för att kontrollera åtkomsten.
Du kan också besöka de populära handledningarna inklusive hur man installerar MySQL 8 på Ubuntu, hur man installerar MySQL 8 på Windows, bloggdatabas i MySql, omröstnings- och enkätdatabas i MySql och lär dig grundläggande SQL-frågor i MySQL.
RBAC-databas
Det allra första steget är att skapa RBAC-databasen. Den kan skapas med hjälp av frågan som visas nedan.
CREATE SCHEMA `rbac` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Jag har använt teckenuppsättningen utf8mb4 för att stödja ett stort antal tecken.
Användartabell
I det här avsnittet kommer vi att utforma användartabellen för att lagra användarinformation. Nedan nämns beskrivningen av alla kolumner i användartabellen.
Id | Det unika ID:t för att identifiera användaren. |
Förnamn | Användarens förnamn. |
Mellannamn | Användarens mellannamn. |
Efternamn | Användarens efternamn. |
Mobil | Användarens mobilnummer. Den kan användas för inloggning och registreringsändamål. |
E-post | Användarens e-postadress. Den kan användas för inloggning och registreringsändamål. |
Lösenordshash | Lösenords-hash som genereras av lämplig algoritm. Vi måste undvika att lagra vanliga lösenord. |
Registrerad på | Denna kolumn kan användas för att beräkna användarens livslängd med programmet. |
Senaste inloggning | Den kan användas för att identifiera användarens senaste inloggning. |
Intro | Den korta introduktionen av användaren. |
Profil | Användarinformationen. |
Användartabellen med lämpliga begränsningar är som visas nedan.
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) );
Rolltabell
I det här avsnittet kommer vi att utforma Rolltabellen för att lagra systemrollerna. Nedan nämns beskrivningen av alla kolumner i rolltabellen.
Id | Det unika ID:t för att identifiera rollen. |
Titel | Rollens titel. |
Snigel | Den unika snigeln för att söka efter rollen. |
Beskrivning | Beskrivningen för att nämna rollen. |
Aktiv | Flaggan för att kontrollera om rollen för närvarande är aktiv. |
Skapat vid | Den lagrar datum och tid då rollen skapas. |
Uppdaterad kl. | Den lagrar datum och tid då rollen uppdateras. |
Innehåll | Fullständig information om rollen. |
Rolltabellen med lämpliga begränsningar är som visas nedan.
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) );
Tillståndstabell
I det här avsnittet kommer vi att utforma Tillståndstabellen för att lagra systembehörigheterna. Nedan nämns beskrivningen av alla kolumner i behörighetstabellen.
Id | Det unika ID:t för att identifiera behörigheten. |
Titel | Tillståndstiteln. |
Snigel | Den unika snigeln för att söka efter behörigheten. |
Beskrivning | Beskrivningen för att nämna tillståndet. |
Aktiv | Flaggan för att kontrollera om behörigheten för närvarande är aktiv. |
Skapat vid | Den lagrar datum och tid då behörigheten skapas. |
Uppdaterad kl. | Den lagrar datum och tid då behörigheten uppdateras. |
Innehåll | Fullständig information om behörigheten. |
Tillståndstabellen med lämpliga begränsningar är som visas nedan.
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) );
Tabell för rollbehörigheter
Rollbehörighetstabellen kan användas för att lagra mappningarna av behörigheterna till rollerna. Nedan nämns beskrivningen av alla kolumner i Rollbehörighetstabellen.
Roll-ID | Roll-id för att identifiera rollen. |
Behörighets-ID | Behörighets-id för att identifiera behörigheten. |
Skapat vid | Den lagrar datum och tid då kartläggningen skapas. |
Uppdaterad kl. | Den lagrar datum och tid då kartläggningen uppdateras. |
Rollbehörighetstabellen med lämpliga begränsningar visas nedan.
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);
Användarroll
Vi kan hålla systemet enkelt genom att tilldela en enda roll till användaren. Den tilldelade rollen kan användas för att dra de behörigheter som är mappade till rollen. Åtkomsten till den specifika resursen eller behörigheten kan kontrolleras genom att jämföra den hårdkodade behörigheten med listan över behörigheter som är mappade till rollen som tilldelats användaren.
Det kan göras med hjälp av frågan som visas nedan.
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;
Avancerade alternativ
Man kan tänka sig att tilldela flera roller till användaren med hjälp av användarrolltabellen. De mer avancerade alternativen inkluderar hierarkisystemet för att gruppera behörigheterna eller rollerna. Dessa alternativ komplicerar ytterligare frågan för att hämta behörighetslistan, och behöver därför optimeras genom att ha en lämplig cache-mekanism.
Sammanfattning
I den här handledningen har vi diskuterat databasdesignen för ett RBAC-system för att säkra specifika förfrågningar och resurser genom att endast tillåta åtkomst om användaren har lämplig behörighet.
Du kan skicka in dina kommentarer för att delta i diskussionen. Du kanske också är intresserad av att designa databasen för blogg- och omröstnings- och undersökningsapplikationerna.
Det fullständiga databasschemat finns också tillgängligt på GitHub.