Questa esercitazione fornisce i passaggi completi per progettare uno schema di database di un sistema RBAC (Role-Based Access Control) per gestire utenti, ruoli e autorizzazioni. Può essere ulteriormente utilizzato per decidere l'accesso a risorse specifiche in base a autorizzazioni specifiche. L'utilizzo di un sistema RBAC deve essere considerato parte integrante di qualsiasi applicazione che condivida le risorse tra più utenti. Per esempio. i dipendenti di un'organizzazione possono accedere o gestire i prodotti in base alle autorizzazioni loro assegnate. Idealmente, le autorizzazioni possono essere assegnate tramite ruoli.
Il diagramma della relazione tra entità o il design del database visivo è mostrato di seguito.
Fig 1
Note :le tabelle dei ruoli e delle autorizzazioni discusse in questo tutorial possono essere aggiunte ai database dell'applicazione discussi nei tutorial Blog e Sondaggi e sondaggi. Questo tutorial presuppone che le autorizzazioni siano codificate a livello di codice per verificare l'accesso.
Puoi anche visitare i tutorial più diffusi, tra cui Come installare MySQL 8 su Ubuntu, Come installare MySQL 8 su Windows, Blog Database in MySql, Poll and Survey Database in MySql e Scopri le query SQL di base in MySQL.
Database RBAC
Il primo passo è creare il database RBAC. Può essere creato utilizzando la query come mostrato di seguito.
CREATE SCHEMA `rbac` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Ho usato il set di caratteri utf8mb4 per supportare un'ampia gamma di caratteri.
Tabella utenti
In questa sezione, progetteremo la Tabella utente per memorizzare le informazioni sull'utente. Di seguito è riportata la descrizione di tutte le colonne della Tabella Utente.
ID | L'ID univoco per identificare l'utente. |
Nome | Il nome dell'utente. |
Secondo nome | Il secondo nome dell'utente. |
Cognome | Il cognome dell'utente. |
Cellulare | Il numero di cellulare dell'utente. Può essere utilizzato per scopi di accesso e registrazione. |
L'e-mail dell'utente. Può essere utilizzato per scopi di accesso e registrazione. | |
Hash password | L'hash della password generato dall'algoritmo appropriato. Dobbiamo evitare di memorizzare password semplici. |
Registrato presso | Questa colonna può essere utilizzata per calcolare la vita dell'utente con l'applicazione. |
Ultimo accesso | Può essere utilizzato per identificare l'ultimo accesso dell'utente. |
Introduzione | La breve introduzione dell'Utente. |
Profilo | I dettagli dell'utente. |
La tabella utente con i vincoli appropriati è quella mostrata di seguito.
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) );
Tabella dei ruoli
In questa sezione, progetteremo la Tabella dei ruoli per memorizzare i ruoli di sistema. Di seguito è riportata la descrizione di tutte le colonne della Tabella dei Ruoli.
ID | L'ID univoco per identificare il ruolo. |
Titolo | Il titolo del ruolo. |
Slug | Lo slug unico per cercare il ruolo. |
Descrizione | La descrizione per menzionare il ruolo. |
Attivo | Il flag per verificare se il ruolo è attualmente attivo. |
Creato a | Memorizza la data e l'ora in cui viene creato il ruolo. |
Aggiornato a | Memorizza la data e l'ora in cui il ruolo viene aggiornato. |
Contenuto | I dettagli completi sul ruolo. |
La tabella dei ruoli con i vincoli appropriati è quella mostrata di seguito.
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) );
Tabella delle autorizzazioni
In questa sezione, progetteremo la Tabella delle autorizzazioni per memorizzare le autorizzazioni di sistema. Di seguito è indicata la descrizione di tutte le colonne della tabella dei permessi.
ID | L'ID univoco per identificare l'autorizzazione. |
Titolo | Il titolo dell'autorizzazione. |
Slug | Lo slug unico per cercare l'autorizzazione. |
Descrizione | La descrizione per menzionare l'autorizzazione. |
Attivo | Il flag per verificare se l'autorizzazione è attualmente attiva. |
Creato a | Memorizza la data e l'ora in cui viene creata l'autorizzazione. |
Aggiornato a | Memorizza la data e l'ora in cui l'autorizzazione viene aggiornata. |
Contenuto | I dettagli completi sull'autorizzazione. |
La tabella delle autorizzazioni con i vincoli appropriati è quella mostrata di seguito.
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) );
Tabella dei permessi di ruolo
La Tabella delle autorizzazioni di ruolo può essere utilizzato per memorizzare le mappature delle autorizzazioni ai ruoli. Di seguito è riportata la descrizione di tutte le colonne della Tabella dei permessi dei ruoli.
ID ruolo | L'ID del ruolo per identificare il ruolo. |
ID autorizzazione | L'ID autorizzazione per identificare l'autorizzazione. |
Creato a | Memorizza la data e l'ora in cui viene creata la mappatura. |
Aggiornato a | Memorizza la data e l'ora in cui viene aggiornata la mappatura. |
La tabella delle autorizzazioni di ruolo con i vincoli appropriati è quella mostrata di seguito.
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);
Ruolo utente
Possiamo mantenere il sistema semplice assegnando un unico ruolo all'utente. Il ruolo assegnato può essere utilizzato per estrarre le autorizzazioni mappate al ruolo. L'accesso alla specifica risorsa o autorizzazione può essere verificato confrontando l'autorizzazione hardcoded con l'elenco delle autorizzazioni mappate al ruolo assegnato all'utente.
Può essere fatto utilizzando la query come mostrato di seguito.
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;
Opzioni avanzate
Si può pensare di assegnare più ruoli all'utente utilizzando la tabella ruoli utente. Le opzioni più avanzate includono il sistema gerarchico per raggruppare le autorizzazioni oi ruoli. Queste opzioni complicano ulteriormente la query per estrarre l'elenco delle autorizzazioni, quindi richiedono l'ottimizzazione con un meccanismo di cache appropriato.
Riepilogo
In questo tutorial, abbiamo discusso la progettazione del database di un sistema RBAC per proteggere richieste e risorse specifiche consentendo l'accesso solo se l'utente dispone dell'autorizzazione appropriata.
Puoi inviare i tuoi commenti per partecipare alla discussione. Potresti anche essere interessato a progettare il database delle applicazioni Blog e Sondaggi e sondaggi.
Lo schema completo del database è disponibile anche su GitHub.