sql >> Databáze >  >> RDS >> Mysql

Průvodce návrhem databáze pro RBAC v MySQL

Tento výukový program poskytuje úplné kroky k návrhu schématu databáze systému řízení přístupu založeného na rolích (RBAC) pro správu uživatelů, rolí a oprávnění. Může být dále použit k rozhodování o přístupu ke konkrétním zdrojům na základě konkrétních oprávnění. Použití systému RBAC by mělo být považováno za nedílnou součást jakékoli aplikace sdílející zdroje mezi více uživateli. Např. zaměstnanci organizace mohou přistupovat k produktům nebo je spravovat na základě oprávnění, která jim byla přidělena. V ideálním případě lze oprávnění přidělovat prostřednictvím rolí.

Diagram vztahů entit nebo návrh vizuální databáze je uveden níže.

Obr. 1

Poznámky :Tabulky rolí a oprávnění popisované v tomto kurzu lze přidat do databází aplikace probíraných v kurzech Blog a Průzkumy a průzkumy. Tento kurz předpokládá, že oprávnění jsou pevně zakódována na úrovni kódu pro kontrolu přístupu.

Můžete také navštívit oblíbené výukové programy včetně Jak nainstalovat MySQL 8 na Ubuntu, Jak nainstalovat MySQL 8 na Windows, Databáze blogů v MySql, Databáze anket a průzkumů v MySql a Naučte se základní SQL dotazy v MySQL.

Databáze RBAC

Úplně prvním krokem je vytvoření databáze RBAC. Lze jej vytvořit pomocí dotazu, jak je uvedeno níže.

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

Použil jsem znakovou sadu utf8mb4 pro podporu široké škály znaků.

Tabulka uživatelů

V této části navrhneme Tabulku uživatelů k ukládání uživatelských informací. Níže je uveden popis všech sloupců tabulky uživatelů.

ID Jedinečné ID k identifikaci uživatele.
Křestní jméno Křestní jméno uživatele.
Prostřední jméno Prostřední jméno uživatele.
Příjmení Příjmení uživatele.
Mobil Číslo mobilního telefonu uživatele. Lze jej použít pro účely přihlášení a registrace.
E-mail E-mailová adresa uživatele. Lze jej použít pro účely přihlášení a registrace.
Hašování hesla Hash hash hesla vygenerovaný příslušným algoritmem. Musíme se vyhnout ukládání jednoduchých hesel.
Registrováno na Tento sloupec lze použít k výpočtu životnosti uživatele s aplikací.
Poslední přihlášení Lze jej použít k identifikaci posledního přihlášení uživatele.
Úvod Krátké představení uživatele.
Profil Podrobnosti uživatele.

Tabulka uživatelů s příslušnými omezeními je uvedena níže.

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

Tabulka rolí

V této části navrhneme Tabulku rolí pro uložení systémových rolí. Níže je uveden popis všech sloupců tabulky rolí.

ID Jedinečné ID k identifikaci role.
Název Název role.
Slimák Jedinečný slimák pro vyhledávání role.
Popis Popis pro zmínku o roli.
Aktivní Příznak pro kontrolu, zda je role aktuálně aktivní.
Vytvořeno v Ukládá datum a čas, kdy byla role vytvořena.
Aktualizováno dne Ukládá datum a čas, kdy je role aktualizována.
Obsah Úplné podrobnosti o roli.

Tabulka rolí s příslušnými omezeními je uvedena níže.

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

Tabulka oprávnění

V této části navrhneme Tabulku oprávnění pro uložení systémových oprávnění. Níže je uveden popis všech sloupců tabulky oprávnění.

ID Jedinečné ID k identifikaci oprávnění.
Název Název oprávnění.
Slimák Jedinečný slimák pro vyhledávání oprávnění.
Popis Popis uvádějící oprávnění.
Aktivní Příznak pro kontrolu, zda je oprávnění aktuálně aktivní.
Vytvořeno v Ukládá datum a čas, kdy bylo oprávnění vytvořeno.
Aktualizováno dne Ukládá datum a čas, kdy je oprávnění aktualizováno.
Obsah Úplné podrobnosti o oprávnění.

Tabulka oprávnění s příslušnými omezeními je uvedena níže.

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

Tabulka oprávnění role

Tabulka oprávnění role lze použít k uložení mapování oprávnění k rolím. Níže je uveden popis všech sloupců tabulky oprávnění role.

ID role ID role k identifikaci role.
ID oprávnění ID oprávnění k identifikaci oprávnění.
Vytvořeno v Ukládá datum a čas, kdy je mapování vytvořeno.
Aktualizováno dne Ukládá datum a čas, kdy je mapování aktualizováno.

Tabulka oprávnění role s příslušnými omezeními je uvedena níže.

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

Uživatelská role

Můžeme udržet systém jednoduchý tím, že uživateli přiřadíme jedinou roli. Přiřazenou roli lze použít k získání oprávnění namapovaných na roli. Přístup ke konkrétnímu zdroji nebo oprávnění lze zkontrolovat porovnáním pevně zakódovaného oprávnění se seznamem oprávnění namapovaných na roli přiřazenou uživateli.

To lze provést pomocí dotazu, jak je uvedeno níže.

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;

Pokročilé možnosti

Lze uvažovat o přiřazení více rolí uživateli pomocí tabulky uživatelských rolí. Mezi pokročilejší možnosti patří systém hierarchie pro seskupení oprávnění nebo rolí. Tyto možnosti dále komplikují dotaz na vytažení seznamu oprávnění, a proto je potřeba optimalizace pomocí vhodného mechanismu mezipaměti.

Shrnutí

V tomto tutoriálu jsme diskutovali o návrhu databáze systému RBAC pro zabezpečení konkrétních požadavků a zdrojů povolením přístupu pouze v případě, že má uživatel odpovídající oprávnění.

Do diskuse můžete zasílat své komentáře. Také by vás mohl zajímat návrh databáze aplikací Blog a Poll &Survey.

Kompletní schéma databáze je k dispozici také na GitHubu.


  1. správná syntaxe k použití poblíž '?'

  2. Platné modifikátory pro funkce data/času SQLite

  3. Příkaz SQL GROUP BY CASE s agregační funkcí

  4. Jak ignorovat chyby pomocí psql \copy meta-command