2011-09-20 8 views
5

Estoy creando un sistema en el que las organizaciones ingresarán información relacionada con sus negocios. Los informes deben estar disponibles para los usuarios en múltiples niveles donde algunos usuarios solo tendrán acceso a las estadísticas de su organización y los usuarios de mayor nivel tendrán acceso tanto a las estadísticas individuales de la organización como a las estadísticas agregadas para las entidades de un nivel superior (vea mi diagrama que ilustra La jerarquía).Administración de permisos de usuario con una jerarquía

Example hierarchy

  • Habrá una o más organizaciones dentro de un municipio.
  • Habrá uno o más municipios en un condado
  • Habrá uno o más condados en un estado
  • habrá uno o más estados
  • organizaciones, municipios, condados y estados pueden añadirse en cualquier momento
  • Cuando se agrega al sistema una organización, municipio o condado, un usuario que ya tiene permiso para ver ese estado debería poder ver automáticamente los informes de la nueva organización/municipio/condado sin que el administrador tenga que explícitamente otórgales permiso. Lo mismo debería aplicarse a los usuarios que tienen permiso para ver informes a nivel municipal y de condado cada vez que se agrega al sistema una nueva entidad debajo de ellos en la jerarquía.

Algunos ejemplos:

usuario 1: sólo pueden ver los informes de la organización # 1

Usuario 2: pueden ver los informes de todas las organizaciones bajo Municipio # 2

Usuario 3: Puede ver informes para todas las organizaciones bajo los municipios # 1 & # 2

usuario 4: pueden ver los informes de todas las organizaciones bajo el condado # 3

usuario 5: puede ver los informes de todos los condados bajo estado # 3

Mi pregunta es ¿Cómo puedo organizar esto? No estoy seguro de la mejor manera de asignar permisos a informes sin asignar permisos a organizaciones individuales. Eso claramente no es práctico.

He visto algunas preguntas aquí que tratan con ACL pero no parecen aplicarse a esto. Si lo hace, una explicación de cómo se relacionaría con ACL sería una respuesta satisfactoria también.

Respuesta

1

Estoy pensando que una forma es que assing un identificador de autorización única para cada entidad (oranisation, municipio, condado, estado)

Así las tablas deben tener una nueva columna permission_id con la siguiente forma: organización 1 habrá permission_id O1 organización 2 tendrá permiso Identificación del O2

Municipio 1 tendrá permiso M1 Identificación del Municipio 2 tendrá permiso Identificación del M2

y así sucesivamente.

A continuación, se puede hacer una tabla de permisos (id, id_user, permisos) que la columna de permisos será algo así como O1 - permisssion sólo para Organisation1 M1 - el permiso para todas las organizaciones en el Municipio 1 M1M2 - el permiso para todas las organizaciones de municipios 1 y 2

S1 - permiso para que el estado 1

Esto es sólo mi opinión. Siempre que sepa que un usuario tiene acceso a un municipio, debe tener acceso a todo lo que se encuentre bajo ese municipio. Algunas funciones de php que pueden obtener la ruta de la entidad actual pueden coincidir con el permiso del usuario.

ejemplo.

Estás en la página del municipio. M2. Con un usuario que tiene permiso para S2 Su función tendrá como argumento la identificación del municipio y la función creará una ruta: M2, C3, S1. Usted compara S2 con S1 y se deniega el permiso. De esta forma, la complejidad es O (n) donde n es el número de entidades (orgs, municipalidades, condados y estados, es decir 4).

4

Sugeriría crear una serie de grupos de usuarios en su base de datos, cada uno de los cuales tiene uno o más niveles de cuenta de usuario, asignar un número entero como un valor jerárquico al grupo y luego hacer lo mismo con la cuenta individual niveles dentro del grupo, algo como esto (esta es una estructura relacional, utilizan InnoDB):

table: account_groups (Broader account groupings) 
Fields: 
-id_key - primary key, auto number 
-group - unique index 
-parent - index, foreign key=account_groups.group (this allows you to create group trees, so you can specify that a county group belongs to a state, and a municipality belongs to a county group, etc.) 
-group_hierarchy - integer (0 is highest permission group, each subsequent one step lower) 

table: account_levels (Account levels within a group) 
Fields: 
-id_key - primary key, auto number 
-account_level - unique index 
-group - index, foreign key=account_groups.group 
-account_heirarchy - integer (same as other table but denotes heirarchy within the group 

table: user_accounts (Individual user accounts) 
Fields: 
-id_key - primary key, auto number 
-account_id - unique index, user account name 
-account_level - index, foreign key=account_levels.account_level 

table: user_groups (denotes which tree(s) the user has access to) 
Fields: 
-id_key - primary key, auto number 
-account_id - index, foreign key=user_accounts.account_id 
-group - index, foreign key=account_groups.group 

y luego por los permisos:

table: permissions (directory of permissions that could be applied) 
Fields: 
-id_key - primary key, auto number 
-permission - unique index, permission identifier 
-other stuff you need associated with the individual permissions, based on how you want them to hook into your program 

table: permissions_group_permissions (permissions applied at group level) 
Fields: 
-id_key - primary key, auto number 
-group - index, foreign key=account_groups.group 
-permission - index, foreign key= permissions.permission 

table: permissions_account_permissions (permissions applied at account level) 
Fields: 
-id_key - primary key, auto number 
-account_type - index, foreign key=account_levels.account_level 
-permission - index, foreign key=permissions.permission 

table: permissions_individual_permissions (permissions applied to individual accounts, if neccessary) 
Fields: 
-id_key - primary key, auto number 
-account_id - index, foreign key=user_accounts.account_id 
-permission - index, foreign key=permissions.permission 
-allow_or_deny - boolean (TRUE means permission is granted, FALSE means permission if revoked. This allows you to fine tune individual accounts, either granting custom elevated permissions, or revoking individual permissions for troublesome accounts without demoting them from the group. This can be useful in some special circumstances) 
-expiration - timestamp (allows you to set expiration dates for permissions, like if you want to temporarily suspend a specific action. Programmatically set default value of 00/00/00 00:00:00 as indefinite. You can do this at the account and group levels too by adding this field to those tables.) 

luego, puede usar PHP para iterar a través de los permisos de la cuenta individual por fi Primero obtener el grupo asociado con el nivel de cuenta, hacer una matriz de cada grupo subsiguiente en el orden jerárquico y luego iterar a través del orden jerárquico para el grupo actual (agregar como matriz multidimensional a matriz de grupo) desde el nivel de cuenta actual dentro del grupo hasta el último nivel de cuenta existente dentro del grupo. A continuación, tomaría todo el nivel de la cuenta para cada grupo subsiguiente y finalmente obtendría todos los permisos asociados para cada nivel de cuenta que se haya agregado a la matriz. Si implementa los permisos de usuario individuales, deberá agregar su matriz de permisos con los permisos aplicados individualmente y, por último, eliminar todos los permisos de su matriz que tengan su campo allow_or_deny establecido en FALSE. Si el usuario necesita tener acceso a múltiples árboles, agregue un registro a la tabla account_groups que coincida con su ID de cuenta, que indique cuál es el nivel más alto del árbol al que tienen acceso, y luego itere a través de todos los grupos subsiguientes en el árbol. Para otorgar todos los permisos aplicables a la cuenta, tome todas las asociaciones de grupo para el account_id de user_groups, y luego ejecute el proceso descrito anteriormente para cada árbol. Si solo tienen acceso a un árbol, ni siquiera necesita usar la tabla user_groups.

an example of how the structure fits your model: 
group: USA, hierarchy = 0 
group: California, parent-> USA, hierarchy = 1 
group: Los Angeles, parent->California, hierarchy = 2 
group: Texas, parent->USA, hierarchy = 1 
group: Dallas, parent->Texas, hierarchy = 2 

Los miembros del grupo EE. UU. Pueden acceder a todo. Los miembros de California puede acceder a todos los grupos subsiguientes en la jerarquía de California, pero no grupos de Texas, a pesar de que tienen el mismo valor jerárquico (porque son diferentes ramas de los padres)

account levels: 
admin, hierarchy=0 
manager, hierarchy=1 
analyst, hierarchy=2 
staff member, hierarchy=3 

Cada nivel cuenta tiene toda la permisos para cada nivel de cuenta posterior.

user accounts: 
Bob, manager (likes to spam junk email to everyone) 

todavía puede revocar el permiso para enviar por correo electrónico Bob añadiendo el permiso de correo electrónico a permissions_individual_permissions y estableciendo el valor allow_or_deny a FALSO. Esto le permite detener a Bob de enviar spam sin degradarlo de la administración.

+0

Además, esto le permitirá establecer diferentes niveles de permisos para diferentes árboles, por lo que un solo usuario podría tener acceso de estado en un árbol, pero solo acceso municipal en otro árbol. – mopsyd

Cuestiones relacionadas