Eu tenho um modelo de banco de dados com uma tabela de usuários e uma 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 da 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 eu tenho duas maneiras diferentes de projetar os direitos. Uma tabela com uma coluna de 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 contras de uma tabela de direitos versus uma tabela de direitos por elemento? - ou é a maneira mais adequada de fazer isso?
Em primeiro lugar, 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ção(õ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 direitos aos elementos via lista de controle de acesso (propriedade). DAC define: "quem tem acesso aos meus dados". O usuário (proprietário) concede permissões ao recurso de propriedade.
De qualquer forma, sugiro este modelo de dados:
(relação de um para um)
1) RBAC (relação muitos para muitos)
2) DAC (relação muitos para muitos)
Com uma tabela de direitos para cada elemento, assim que você adicionar um elemento, precisará adicionar uma tabela. Isso aumentaria a manutenção do aplicativo.
A desvantagem de colocar tudo em uma tabela é que você pode ter problemas de dimensionamento, mas eles podem ser mitigados usando particionamento, visualizações materializadas e/ou colunas virtuais. Provavelmente tais 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 Users e o Id na tabela Roles conforme necessário. A tabela Permissões poderia então ter elementos atribuídos a funções que, por sua vez, são atribuídas a usuários e/ou ter elementos atribuídos diretamente a usuários.