Pregunta

Lo que sería una estructura ideal para los usuarios> Permisos de objetos.

he visto muchos mensajes relacionados para los permisos generales, o qué secciones de una lata de acceso de usuario, que consiste en una users, userGroups y userGroupRelations o algo por el estilo.

En mi sistema hay muchos objetos diferentes que pueden quedar creados, y cada uno tiene que ser capaz de ser encendido o apagado. Por ejemplo, tomemos un gestor de contraseñas que tiene grupos y subgrupos.

Group 1
    Group 2
    Group 3
    Group 4
Group 5
   Group 6
Group 7
   Group 8
       Group 9
       Group 10

Cada grupo puede contener un conjunto de contraseñas. Un usuario puede darse leer, escribir, editar y eliminar permisos a ningún grupo. Más grupos pueden obtener creado en cualquier punto en el tiempo.

Si alguien tiene permiso para un grupo, yo debería ser capaz de hacer que tiene permisos para todos los subgrupos o limitar a solo ese grupo.

Mi pensamiento actual es tener una tabla de usuarios, y luego una tabla de permisos con columnas como:

permission_id (int) PRIMARY_KEY
user_id (int) INDEX
object_id (int) INDEX
type (varchar) INDEX
admin (bool)
read (bool)
write (bool)
edit (bool)
delete (bool)

Esto ha funcionado en el pasado, pero el nuevo sistema que estoy construyendo tiene que ser capaz de escalar rápidamente, y estoy seguro si esta es la mejor estructura. También hace que la idea de tener a alguien con todos los permisos subgrupo de un grupo más difícil.

Habrá una tabla separada para roles de usuarios / administradores, que significa que pueden cambiar los permisos de los usuarios siguientes grupos a los que pueden controlar.

Por lo tanto, como una pregunta, se debe utilizar la estructura anterior? O me punto puede alguien en la dirección de una mejor?


editar

alternativa es crear una tabla de permiso para cada tipo de objeto.

¿Fue útil?

Solución

Le sugiero que añadir una marca de tiempo "last_update" y una columna "last_updated_by_user" por lo que tiene alguna esperanza de seguimiento de los cambios en esta tabla en su sistema de funcionamiento.

Se podría considerar la adición de un permiso - concesión. Un usuario que tenga permiso para un objeto de subvención sería capaz de conceder acceso a otros usuarios al objeto en cuestión.

Tenga cuidado con "necesidades de escalar rápidamente." Es difícil de adivinar y sin experiencia en la producción del mundo real lo que es un sistema de mayor escala realmente necesita.

Además, tenga cuidado de no complicar excesivamente un sistema de permisos, debido a un sistema demasiado complejo será difícil de verificar y por lo tanto más fácil de roer. Un sistema simple será mucho más fácil para perfeccionar por aumento a escala de una más compleja.

Su esquema parece estar relacionado usuarios a los objetos. ¿Quiere que su clave primaria y su índice único a ser (user_id, object_id)? Es decir, ¿desea que cada usuario tenga cero o uno permiso de entrada para cada objeto? Si es así, utilizar la clave principal para hacer cumplir que, en lugar de utilizar el sustituto clave que usted propone permission_id.

Para los objetos que existen en jerarquías, debe hacer una de dos opciones en todo el sistema:

  1. una subvención a un objeto con subobjetos implícitamente otorga acceso sólo a la objeto, o ...

  2. También permite el acceso a todos los subobjetos.

La segunda opción reduce la carga de la concesión de permiso explícito cuando se crean nuevos objetos parciales. La primera opción es más seguro.

La segunda opción hace que sea más difícil determinar si un usuario tiene acceso a un objeto en particular, porque hay que caminar por la jerarquía de objetos hacia la raíz del árbol en busca de donaciones de acceso en objetos padre al verificar si un usuario tiene acceso. Ese problema de rendimiento debe dominar su toma de decisiones. ¿Sus usuarios crear unos objetos y acceder a ellos a menudo? O van a crear muchos objetos y subobjetos y acceder a ellos rara vez? Si el acceso es más frecuente que la creación, desea que la primera opción. Recibir el golpe por encima de concesión de permiso a la hora de la creación de objetos, en lugar de un golpe permiso-buscar a la hora del acceso a objetos.

Creo que la primera opción es probablemente superior. Sugiero esta disposición de la tabla:

user_id (int)
object_id (int)
type (varchar)  (not sure what you have this column for)
admin (bool)
read (bool)
write (bool)
edit (bool)
grant (bool)
delete (bool)
last_update (timestamp)
last_updated_by_user_id (int)
primary key = user_id, object_id.

También podría utilizar este diseño de la mesa, y tienen una fila de la tabla distinta para cada permiso otorgado a cada usuario para cada objeto. Éste escalas con mayor facilidad si se agregan más tipos de permisos.

user_id (int)
object_id (int)
permission_enum (admin/read/write/edit/grant/delete)
type (varchar)  (not sure what you have this column for)
last_update (timestamp)
last_updated_by_user_id (int)
primary key = user_id, object_id, permission_enum
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top