Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Guia para projetar banco de dados para RBAC no MySQL


Este tutorial fornece etapas completas para projetar um esquema de banco de dados de um sistema de controle de acesso baseado em função (RBAC) para gerenciar os usuários, funções e permissões. Ele também pode ser usado para decidir o acesso a recursos específicos com base em permissões específicas. O uso de um sistema RBAC deve ser considerado como parte integrante de qualquer aplicativo que compartilhe os recursos entre vários usuários. Por exemplo. os funcionários de uma organização podem acessar ou gerenciar os produtos com base nas permissões atribuídas a eles. Idealmente, as permissões podem ser atribuídas por meio de funções.



O diagrama de relacionamento de entidade ou design de banco de dados visual é mostrado abaixo.



Figura 1



Observações :As tabelas de funções e permissões discutidas neste tutorial podem ser adicionadas aos bancos de dados de aplicativos discutidos nos tutoriais Blog e Poll &Survey. Este tutorial pressupõe que as permissões são codificadas no nível do código para verificar o acesso.



Você também pode visitar os tutoriais populares, incluindo How To Install MySQL 8 on Ubuntu, How To Install MySQL 8 on Windows, Blog Database in MySql, Poll and Survey Database in MySql e Learn Basic SQL Queries In MySQL.


Banco de dados RBAC




O primeiro passo é criar o banco de dados RBAC. Ele pode ser criado usando a consulta conforme mostrado abaixo.


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



Eu usei o conjunto de caracteres utf8mb4 para suportar uma ampla gama de caracteres.


Tabela de usuário




Nesta seção, projetaremos a Tabela do usuário para armazenar informações do usuário. Abaixo está a descrição de todas as colunas da Tabela de Usuários.


ID O ID exclusivo para identificar o usuário.
Nome O primeiro nome do usuário.
Nome do meio O nome do meio do usuário.
Sobrenome O sobrenome do usuário.
Celular O número de celular do usuário. Ele pode ser usado para fins de login e registro.
E-mail O e-mail do usuário. Ele pode ser usado para fins de login e registro.
Hash de senha O hash de senha gerado pelo algoritmo apropriado. Devemos evitar armazenar senhas simples.
Registrado em Esta coluna pode ser usada para calcular a vida útil do usuário com o aplicativo.
Último login Pode ser usado para identificar o último login do usuário.
Introdução A breve introdução do usuário.
Perfil Os detalhes do usuário.



A Tabela de Usuários com as restrições apropriadas é mostrada abaixo.


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


Tabela de Funções




Nesta seção, projetaremos a Tabela de funções para armazenar as funções do sistema. Abaixo mencionada é a descrição de todas as colunas da Tabela de Funções.


ID O ID exclusivo para identificar a função.
Título O título da função.
Slug O slug exclusivo para pesquisar a função.
Descrição A descrição para mencionar a função.
Ativo O sinalizador para verificar se a função está ativa no momento.
Criado em Ele armazena a data e hora em que a função foi criada.
Atualizado em Ele armazena a data e hora em que a função é atualizada.
Conteúdo Os detalhes completos sobre a função.



A Tabela de Funções com as restrições apropriadas é mostrada abaixo.


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


Tabela de permissões




Nesta seção, projetaremos a Tabela de permissões para armazenar as permissões do sistema. Abaixo mencionada é a descrição de todas as colunas da Tabela de Permissões.


ID O ID exclusivo para identificar a permissão.
Título O título da permissão.
Slug O slug exclusivo para pesquisar a permissão.
Descrição A descrição para mencionar a permissão.
Ativo O sinalizador para verificar se a permissão está ativa no momento.
Criado em Ele armazena a data e hora em que a permissão foi criada.
Atualizado em Ele armazena a data e hora em que a permissão é atualizada.
Conteúdo Os detalhes completos sobre a permissão.



A Tabela de Permissões com as restrições apropriadas é mostrada abaixo.


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


Tabela de permissões de funções




A Tabela de permissões de papéis pode ser usado para armazenar os mapeamentos das permissões para as funções. Abaixo mencionada é a descrição de todas as colunas da Tabela de Permissão de Função.


ID da função O ID da função para identificar a função.
ID de permissão O ID da permissão para identificar a permissão.
Criado em Ele armazena a data e hora em que o mapeamento é criado.
Atualizado em Ele armazena a data e hora em que o mapeamento é atualizado.



A Tabela de Permissões de Função com as restrições apropriadas é mostrada abaixo.


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

Função do usuário




Podemos manter o sistema simples atribuindo uma única função ao usuário. A função atribuída pode ser usada para obter as permissões mapeadas para a função. O acesso ao recurso ou permissão específico pode ser verificado comparando a permissão codificada com a lista de permissões mapeadas para a função atribuída ao usuário.



Isso pode ser feito usando a consulta como mostrado abaixo.


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;


Opções avançadas




Pode-se pensar em atribuir várias funções ao usuário usando a Tabela de Funções do Usuário. As opções mais avançadas incluem o sistema de hierarquia para agrupar as permissões ou funções. Essas opções complicam ainda mais a consulta para extrair a lista de permissões, portanto, precisam de otimização por meio de um mecanismo de cache apropriado.


Resumo




Neste tutorial, discutimos o design de banco de dados de um sistema RBAC para proteger solicitações e recursos específicos, permitindo acesso somente se o usuário tiver permissão apropriada.



Você pode enviar seus comentários para participar da discussão. Você também pode estar interessado em projetar o banco de dados dos aplicativos Blog e Poll &Survey.



O esquema completo do banco de dados também está disponível no GitHub.