sql >> Base de Datos >  >> RDS >> Mysql

Guía para diseñar una base de datos para RBAC en MySQL

Este tutorial proporciona pasos completos para diseñar un esquema de base de datos de un sistema de control de acceso basado en roles (RBAC) para administrar los usuarios, los roles y los permisos. Se puede utilizar además para decidir el acceso a recursos específicos en función de permisos específicos. El uso de un sistema RBAC debe considerarse como una parte integral de cualquier aplicación que comparta los recursos entre múltiples usuarios. P.ej. los empleados de una organización pueden acceder o gestionar los productos en función de los permisos que se les asignen. Idealmente, los permisos se pueden asignar a través de roles.

El Diagrama de Relación de Entidades o el diseño de la base de datos visual se muestra a continuación.

higo 1

Notas :Las tablas de roles y permisos que se analizan en este tutorial se pueden agregar a las bases de datos de la aplicación que se analizan en los tutoriales Blog y Poll &Survey. Este tutorial asume que los permisos están codificados a nivel de código para verificar el acceso.

También puede visitar los populares tutoriales, que incluyen Cómo instalar MySQL 8 en Ubuntu, Cómo instalar MySQL 8 en Windows, Base de datos de blogs en MySql, Base de datos de sondeos y sondeos en MySql y Aprenda consultas SQL básicas en MySQL.

Base de datos RBAC

El primer paso es crear la base de datos RBAC. Se puede crear usando la consulta como se muestra a continuación.

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

He usado el conjunto de caracteres utf8mb4 para admitir una amplia gama de caracteres.

Tabla de usuarios

En esta sección, diseñaremos la Tabla de usuarios para almacenar información del usuario. A continuación se menciona la descripción de todas las columnas de la tabla de usuarios.

Id La identificación única para identificar al usuario.
Nombre El nombre del usuario.
Segundo Nombre El segundo nombre del usuario.
Apellido El apellido del usuario.
Móvil El número de móvil del usuario. Se puede utilizar con fines de inicio de sesión y registro.
Correo electrónico El correo electrónico del usuario. Se puede utilizar con fines de inicio de sesión y registro.
Hash de contraseña El hash de contraseña generado por el algoritmo apropiado. Debemos evitar almacenar contraseñas sin formato.
Registrado en Esta columna se puede utilizar para calcular la vida del usuario con la aplicación.
Último inicio de sesión Se puede utilizar para identificar el último inicio de sesión del usuario.
Introducción La breve introducción del Usuario.
Perfil Los detalles del usuario.

La tabla de usuarios con las restricciones adecuadas se muestra a continuación.

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

Mesa de funciones

En esta sección, diseñaremos la tabla de roles para almacenar los roles del sistema. A continuación se menciona la descripción de todas las columnas de la tabla de funciones.

Id La identificación única para identificar el rol.
Título El título del rol.
Babosa El slug único para buscar el rol.
Descripción La descripción para mencionar el rol.
Activo La bandera para verificar si el rol está actualmente activo.
Creado en Almacena la fecha y hora en que se crea el rol.
Actualizado en Almacena la fecha y hora en que se actualiza el rol.
Contenido Los detalles completos sobre el rol.

La tabla de roles con las restricciones apropiadas se muestra a continuación.

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

Tabla de permisos

En esta sección, diseñaremos la Tabla de permisos para almacenar los permisos del sistema. A continuación se menciona la descripción de todas las columnas de la Tabla de permisos.

Id La identificación única para identificar el permiso.
Título El título del permiso.
Babosa El slug único para buscar el permiso.
Descripción La descripción para mencionar el permiso.
Activo La bandera para verificar si el permiso está actualmente activo.
Creado en Almacena la fecha y hora en que se crea el permiso.
Actualizado en Almacena la fecha y hora en que se actualiza el permiso.
Contenido Los detalles completos sobre el permiso.

La tabla de permisos con las restricciones apropiadas se muestra a continuación.

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

Tabla de permisos de roles

La tabla de permisos de roles se puede utilizar para almacenar las asignaciones de los permisos a los roles. A continuación se menciona la descripción de todas las columnas de la Tabla de permisos de roles.

Id. de función La identificación del rol para identificar el rol.
Id. de permiso La identificación del permiso para identificar el permiso.
Creado en Almacena la fecha y hora en que se crea el mapeo.
Actualizado en Almacena la fecha y hora en que se actualiza el mapeo.

La tabla de permisos de roles con las restricciones apropiadas se muestra a continuación.

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

Rol de usuario

Podemos mantener el sistema simple asignando un solo rol al usuario. El rol asignado se puede usar para extraer los permisos asignados al rol. El acceso al recurso o permiso específico se puede comprobar comparando el permiso codificado de forma rígida con la lista de permisos asignados a la función asignada al usuario.

Se puede hacer usando la consulta como se muestra a continuación.

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;

Opciones avanzadas

Uno puede pensar en asignar múltiples roles al usuario utilizando la Tabla de roles de usuario. Las opciones más avanzadas incluyen el sistema de jerarquía para agrupar los permisos o roles. Estas opciones complican aún más la consulta para extraer la lista de permisos, por lo que necesitan optimización al tener un mecanismo de caché adecuado.

Resumen

En este tutorial, analizamos el diseño de la base de datos de un sistema RBAC para proteger solicitudes y recursos específicos al permitir el acceso solo si el usuario tiene el permiso adecuado.

Puede enviar sus comentarios para unirse a la discusión. También te puede interesar diseñar la base de datos de las aplicaciones Blog y Poll &Survey.

El esquema completo de la base de datos también está disponible en GitHub.