Eu tenho um modelo de banco de dados com uma tabela de usuário e tabela de funções. Quero controlar o acesso (direitos) a até 10 elementos diferentes. O acesso pode ser concedido a uma função ou a um único usuário. Abaixo está a definição de tabela de usuários, funções e itens:
CREATE TABLE users
(
id serial NOT NULL PRIMARY KEY,
username character varying UNIQUE,
password character varying,
first_name character varying,
last_name character varying,
...
);
CREATE TABLE roles
(
id serial NOT NULL PRIMARY KEY,
name character varying NOT NULL,
description character varying,
...
);
CREATE TABLE element_1
(
id serial NOT NULL PRIMARY KEY,
name character varying NOT NULL,
description character varying,
...
);
...
Agora, tenho duas maneiras diferentes de projetar os direitos. Uma tabela com uma coluna do tipo de direitos ou 10 tabelas de direitos - uma para cada elemento ao qual desejo controlar o acesso.
Quais são os prós e os contras de uma tabela de direitos versus uma tabela de direitos por elemento? - ou é a maneira mais adequada de fazer isso?
database-design
best-practices
taudorf
fonte
fonte
Respostas:
Primeiro de tudo, que tipo de modelo de segurança você planeja implementar? Controle de Acesso Baseado em Função (RBAC) ou Controle de Acesso Discricionário (DAC)?
ver fonte
1) No RBAC: você precisa da tabela ElementType para atribuir direitos à função (os usuários são atribuídos às funções). O RBAC define: "O que essa função / usuário pode fazer". O administrador atribui direitos a funções e permissões a funções, atribui usuários a funções para acessar recursos. 2) No DAC: usuários e funções têm direito a elementos via lista de controle de acesso (propriedade). O DAC define: "quem tem acesso aos meus dados". Usuário (proprietário) concede permissões ao recurso de propriedade.
De qualquer forma, sugiro este modelo de dados:
(relacionamento um a um)
1) RBAC (relacionamento muitos-para-muitos)
2) DAC (relacionamento muitos-para-muitos)
fonte
Com uma tabela de direitos para cada elemento, assim que você adicionar um elemento, será necessário adicionar uma tabela. Isso adicionaria à manutenção do aplicativo.
A desvantagem de colocar tudo em uma tabela é que você pode ter problemas de dimensionamento, mas esses podem ser mitigados usando particionamento, visualizações materializadas e / ou colunas virtuais. Provavelmente, essas medidas não seriam necessárias.
Quanto ao design da tabela, se isso estivesse no Oracle, eu poderia sugerir algo assim:
O código do pacote pode usar a sequência UserRoleID para preencher o ID na tabela Usuários e o ID na tabela Funções, conforme necessário. A tabela Permissões pode ter elementos atribuídos a funções que, por sua vez, são atribuídas a usuários e / ou elementos atribuídos diretamente a usuários.
fonte