Tengo un modelo de base de datos con una tabla de usuario y una tabla de roles. Quiero controlar el acceso (derechos) a hasta 10 elementos diferentes. El acceso se puede otorgar a un rol o a un solo usuario. A continuación se muestra la definición de la tabla de usuarios, roles y elementos:
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,
...
);
...
Ahora tengo dos formas diferentes de diseñar los derechos. Una tabla con una columna de tipo de derechos o 10 tablas de derechos, una para cada elemento al que quiero controlar el acceso.
¿Cuáles son los pros y los contras de una tabla de derechos frente a una tabla de derechos por elemento? ¿O es la forma más adecuada de hacer esto?
database-design
best-practices
taudorf
fuente
fuente
Respuestas:
En primer lugar, ¿qué tipo de modelo de seguridad planea implementar? ¿Control de acceso basado en roles (RBAC) o control de acceso discrecional (DAC)?
ver fuente
1) En RBAC: necesita la tabla ElementType para asignar derechos a roles (los usuarios se asignan a roles). RBAC define: "¿Qué puede hacer este rol / usuario"? El administrador asigna derechos para roles y permisos a roles, asigna usuarios a roles para acceder a los recursos. 2) En DAC: los usuarios y los roles tienen derechos sobre los elementos a través de la lista de control de acceso (propiedad). DAC define: "quién tiene acceso a mis datos". El usuario (propietario) otorga permisos al recurso propio.
De cualquier manera sugiero este modelo de datos:
(relación uno a uno)
1) RBAC (relación de muchos a muchos)
2) DAC (relación de muchos a muchos)
fuente
Con una tabla de derechos para cada elemento, tan pronto como agregue un elemento, deberá agregar una tabla. Esto agregaría al mantenimiento de la aplicación.
La desventaja de poner todo en una tabla es que podría tener problemas de escala, pero estos podrían mitigarse mediante particiones, vistas materializadas y / o columnas virtuales. Probablemente tales medidas no serían necesarias.
En cuanto al diseño de la tabla, si esto estuviera en Oracle, podría sugerir algo como esto:
El código del paquete podría usar la secuencia UserRoleID para completar el Id. En la tabla Usuarios y el Id. En la tabla Roles según sea necesario. La tabla Permisos podría tener elementos asignados a roles que a su vez se asignan a usuarios y / o elementos asignados directamente a los usuarios.
fuente