¿Cuál es un modelo básico para hacer una base de datos con usuarios y grupos?


9

Estoy tratando de encontrar la mejor manera para un sistema de seguridad básico para un sitio web. Sé que quiero usuarios y grupos.

Pensé que tendría:

user_table
user_id
user_name
...

group_type
group_id
group_name
parent_id
...

group_table
id
user_id
group_id

El primero es el usuario, el segundo es el grupo y el tercero es la tabla intermedia que conecta a los dos. Un usuario tiene muchos grupos.

¿Esto suena bien?


Aparte de los nombres. Su GROUP_TYPEtabla debe tener un nombre GROUPo algo similar, y GROUP_TABLEdebe hacer referencia tanto a Usuarios como a Grupos, ya que eso es lo que está vinculando.
Adam Musch

@adam ¿group_table no hace eso con user_id y group_id?
Johnny

44
@AdamMusch No debe llamarse GRUPO, ya que es una palabra reservada. Las tablas y columnas nunca deben nombrarse después de palabras reservadas
Philᵀᴹ

1
@Phil estuvo de acuerdo. También puede nombrar una tabla SELECTy un campo FROMpara que pueda tener una consulta comoSELECT [FROM] FROM [SELECT]
JNK

2
Intente llamar a las entidades básicas como 'app_user' y 'app_role'
ConcernedOfTunbridgeWells

Respuestas:


17

La forma tradicional de modelar esto es usando un patrón llamado Seguridad basada en roles .

La idea no es solo tener grupos de usuarios, sino también grupos de permisos. Así es como se ve el patrón:

ERD de seguridad basada en roles

Tenga en cuenta que desea evitar las palabras reservadas para los nombres de las tablas, por lo que no debe nombrar sus tablas exactamente como se muestra en el diagrama.

La forma en que funciona es que sus grupos o roles tienen no solo una lista de usuarios asignados a ellos sino también una lista de permisos asignados a ellos. Esto le permite conducir en la mesa tanto quién puede hacer qué, como también qué pueden hacer si me siguen.


Pero, ¿qué sucede si mi usuario tiene algún rol como administrador o lo que sea y, por alguna razón, el mismo usuario también necesita un permiso particular (que no está en ese rol, ni está en ningún otro rol solo)?
levi

@levi: si eso sucede, una forma de manejarlo es hacer un papel especial como "Permisos especiales de Bob" , lo cual es un poco difícil de resolver, pero resuelve el problema siempre que no tenga demasiadas excepciones como esta. Es posible que lo que crees que es una excepción individual en realidad sea un nuevo papel sutil que no has considerado. ¿Qué sucede cuando Bob renuncia? ¿El reemplazo de Bob también necesita ese permiso excepcional? Si es así, en realidad tienes un rol con un miembro, no una excepción.
Joel Brown

@levi - Otra posibilidad es que realmente necesites tener una mezcla de derechos individuales y de roles. En ese caso, su ROLEtabla se puede subtipar en tipos individuales y grupales , donde el tipo de grupo tiene cero a muchos miembros y el tipo individual tiene exactamente un miembro. La forma en que aplica estas reglas de cardinalidad depende de usted. Podría hacerse declarativamente en el esquema de su base de datos, en cuyo caso debe cambiar ligeramente el esquema ilustrado. O puede usar la lógica de la aplicación, en cuyo caso su esquema todavía se parece a lo que he ilustrado anteriormente.
Joel Brown
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.