Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Diseño de una BD - Usuarios, Perfiles, Permisos (https://www.clubdelphi.com/foros/showthread.php?t=39042)

Delphius 09-01-2007 07:51:53

Diseño de una BD - Usuarios, Perfiles, Permisos
 
Buenas foristas, si bien mi dilema que detallo a continuación tiene que ver con el apartado de Base de Datos... no es hacia la conexión, sino más bien al diseño.

Veran, estoy desarrollando una aplicación compleja y grande. La misma está planteada para ser llevada a cabo en forma genérica. Pues, puede aplicarse en cualquier area o departamento, organización, gustos y necesidades. El problema surge al momento de elaborar el diseño relacional de las tablas que intervienen en el apartado de seguridad.

Hasta el momento la base de datos está en papel. Pues, recien tengo material suficiente como para empezar su armado.

Como he dicho anteriormente, debe ser diseñada la base de datos para que se amolde a cualquier ambiente organizacional. Para ser preciso tengo las siguientes tablas:

* Usuarios: que lleva un reguistro de usuarios, obviamente.
* Perfil: que mantiene los distintos perfiles que sean necesarios.
* Roles: Esta tabla es la intermedia entre los usuarios y roles. Como pueden adivinar, mantiene asociado los perfiles a los usuarios.
* Funcionalidad: es una tabla simple que cuenta con un ID y descripción. Mantiene en su interior las funcionalidades permitidas en el sistema.

¿Porque mantengo esta última tabla? Pues, para permitir administrar los permisos a cada usuario a las mismas. Por tanto, pondría una tabla intermedia entre perfil y Funcionalidad. Llamemosla por ahora Permisos.

¡Hasta allí bárbaro! Ahora se pone lindo. He dicho que el sistema debe sobrevirir en cualquier organización. ¿Ahora... que distingue a cada organización? Sus propias "Reglas de Negocio". Por tanto, es en este punto donde todo lo planteado para ser general se lleva hacia la especialidad.
¿Que tiene que ver con todo lo anterior?¿Con usuarios... y perfiles?

Pues, muy sencillo... las mismas reglas de negocio dictan sobre los permisos. La parte interviniente es la administración de dichos permisos. Por poner un ejemplo: Una organización impone como regla general que un usuario X pueda acceder a toda función excepto a la Y. Pero tanto este como otro usuario responden a un perfil P. Restringir esta funcion al perfil viola entonces el modelo relacional.
¿Se entiende?
A lo que voy es que a pesar de que existan perfiles, y funciones. Cada usuario que tenga dicho perfil puede o no estar asignado a dicha función. Por poner un ejemplo: Existen varios administradores, pero algunos con más o menos privilegios que otros. Claro... todo depende de las reglas de negocio.

Entonces... en base a esto, estaba pensando en incorporar otra tabla llamada Regla. Y... viendo las relaciones, me doy con que se conecta con Perfil y Funcionalidad... y ¡ya existe tal relación: Permisos! Se forma otro arco. Y visto desde el punto de normalización esto es algo inaceptable.

yo me estaba imaginando a la tabla Regla con campos ID que se asocien perfiles y funciones (clave foranea) y un campo condicion...

Puede o no existir permisos, pero siempre hay reglas que dictan los posibles permisos... y bueno... hasta allí llego:

DILEMA: ¿Como establezco la relacion? ¿Al final... las reglas van unidas a los permisos?... a los usuarios?... adonde...?

Por eso recurro a ustedes para escuchar opciones, recomendaciones (son vàlidas las de tipo "dejate de romper la cabeza":D)

Disculpen que mande semejante texto...

Saludos,

basti 09-01-2007 16:59:59

Hola Delphius

Por lo que he entendido (si lo he entendido bien), estableces los permisos de usuarios a partir de los perfiles, algo así (perdón si no se entiende bien el gráfico):

Usuarios <- Roles -> Perfiles <- Permisos -> Funcionalidad

El problema es el que tu dices, al no haber una relación directa entre Usuarios y Funcionalidad, no puedes aplicar permisos particulares a un usuario. Esto puede ser un usuario que tenga permisos de que no entran dentro de sus perfiles o un usuario no tenga permisos para algo que está en un perfil que tiene asignado.

Yo haría una de estas dos cosas:

- No romperme la cabeza :D, y pasar de los perfiles
Usuarios <- Permisos -> Funcionalidad

o
- Machacarme la cabeza, añadir una tabla de excepciones que relacione directamente usuarios y Funcionalidad, donde activarías o desactivarías funcionalidades según el usuario

Usuarios <- Roles -> Perfiles <- Permisos -> Funcionalidad
| |
\<--------- Excepciones------------------->/

(Perdón por el cutre ASCIIArt que me he mandado, espero que se entienda).

Supongo que habrá más opciones, pero estas son las que se me ocurren.

Onti 09-01-2007 17:32:24

Cuando estuve en ese punto, desarrolle un modulo de control de acceso basado en el RBAC que es un standar muy utilizado y flexible. ahora ya lo incorpora en todas las aplicaciones que realizo

Delphius 09-01-2007 17:42:48

Cita:

Empezado por basti
- Machacarme la cabeza, añadir una tabla de excepciones que relacione directamente usuarios y Funcionalidad, donde activarías o desactivarías funcionalidades según el usuario

Usuarios <- Roles -> Perfiles <- Permisos -> Funcionalidad
| |
\<--------- Excepciones------------------->/

Entiendo bien lo que dices, pero a nivel relacional de BD, incluso esa forma es incorrecta. Como ves, hay dos arcos entre Usuarios y Funcionalidad. Si es cierto de que en algunos casos hay que romper algunas reglas de normalizacion, pero creo que debe haber una mejor manera. Todavia la sigo buscando.

Onti, me voy a poner a ver eso: RBAC.

Gracias a ambos por responder y ofrecer su ayuda.
Saludos,


La franja horaria es GMT +2. Ahora son las 18:37:54.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi