2012-04-24 13 views
5

Descripción general¿Cómo hacer un sistema de permisos como el siguiente con Symfony 2?

El sistema debe manejar una gran cantidad de elementos organizados en categorías anidadas (véase el ejemplo visual abajo) mientras que da a los clientes la capacidad de definir las reglas de permiso (ver reglas de permiso más adelante). También debe manejar diferentes permisos generales que son independientes de cualquier elemento (por ejemplo, '¿puedes ver una página específica?' O '¿puedes invitar a nuevos miembros?').

Todos los usuarios están organizados en grupos. Cada usuario tiene un grupo principal al que pertenece, pero también puede tener algunos grupos secundarios adicionales.

Algunos usuarios pueden ser configurados como super-administradores y se les debe permitir hacer cualquier cosa.

la hora de decidir si se permite que un usuario a hacer algo, la herencia de permisos es el siguiente:

  • de inicio con los principales permisos de grupo
  • permitir que todos los permisos otorgados por cualquiera de los grupos adicionales del usuario
  • Si está definido, verifique los permisos específicos del usuario (para permitir o denegar, independientemente de lo anterior). permisos específicos de los usuarios no tienen que ser definidas, si no se definen el usuario acaba de heredar el permiso de los grupos permisos

Al definir el permiso de grupo, el cliente puede utilizar la herencia para decir algo como:

  • permitía a los usuarios ...
  • editores tiene todos los permisos de usuarios + ...
  • Moderadores tiene todos los permisos de editores + ... - ...
  • Administradores tiene todos los permisos de Editores + Moderadores

NOTA: yo debería ser capaz de solicitar los últimos 10 artículos de la base de datos que el usuario actual puede editar/ver , la base de datos debe decidir el permiso para cada elemento, no quiero filtrar elementos para obtener permiso en el nivel de la aplicación si puedo decidirlo en función de la información almacenada en la base de datos.

permiso gobierna

Reglas podrían depender de ninguna propiedad del elemento (grupo principal del propietario del elemento, por ejemplo, el tiempo de creación, categoría etc ...), esa información se almacena en la base de datos.

Las reglas también pueden depender de cualquier propiedad del usuario actual (por ejemplo, fecha de registro, miembros invitados), acción solicitada (por ejemplo, ver, enumerar, cambiar nombre, deshacer borrar, etc.) y otra información ya disponible en tiempo de ejecución (por ejemplo, parámetros url, límites de cuota, contenido de elementos, carga del servidor), esa información está disponible para el script php.

Consulte las reglas de ejemplo a continuación.

Visual ejemplo del esquema de base de datos:

Category 1 
    Nested Category A 
     item x 
    Nested Category B 
     Deeply Nested Category 
     item w 
     item y 
Category 2 
    item z 

Actualmente, el esquema de base de datos es similar a la siguiente, pero puedo cambiarlo si es necesario: (por supuesto, esto es sólo una parte del esquema, hay son otras tablas y campos), así

artículos:

id | title | owner_id | category_id 
==================================== 
1 | item x | 2  | 3 
2 | item y | 1  | 4 
3 | item z | 3  | 2 
4 | item w | 1  | 5 

categorías:

id | parents | title 
===================================== 
1 | null | Category 1 
2 | null | Category 2 
3 | 1  | Nested Category A 
4 | 1  | Nested Category B 
5 | 1/4  | Deeply Nested Category 

usuarios:

id | name | group | all_groups | is_super_admin 
=============================================== 
1 | Tony | 5  | 5   | 1 
2 | John | 5  | 5,8,6  | 0 
3 | Mike | 4  | 4,7  | 0 
4 | Ryan | 6  | 6   | 0 

reglas de ejemplo

Las siguientes reglas son sólo muestra de casos del mundo real que se deben implementar.

  • Los usuarios pueden editar sus propios artículos dentro de los 5 minutos de presentación()
  • usuario 'John' puede editar todos los elementos dentro de 'categoría 1' y todas sus categorías anidadas.
  • Los editores pueden editar todos los elementos, excepto los artículos que su propietario está marcado como super administrador.

Tenga en cuenta que estas reglas podrían decidirse en el nivel de la base de datos como la mayoría de las reglas en mi caso.

implementación

docs Symfony He buscado, stackoverflow etc. Hay un montón de artículos interesantes y preguntas sobre el tema de la seguridad y la ACL, pero no pude encontrar la mejor manera de manejar tal sistema.

Está claro que necesito algún tipo de generador dinámico de consultas para filtrar las filas según la información almacenada en la base de datos de acuerdo con las reglas definidas. Supongo que el segundo paso (que involucra información que no está almacenada en la base de datos como la carga actual del servidor) es implementar un votante (ver ejemplo de votante en this article o this question), o incluso una solución más simple (como reglas que depende de la ruta solicitada). Si la solución involucra más de una cosa para manejar permisos, por favor también describa cómo integrarlos y usarlos juntos.

Pregunta

estoy pidiendo cómo implementar un sistema de este tipo, por favor, no responder con enlaces a la documentación de Symfony u otros recursos con idea general y casos sencillos comunes. Por favor, lea y comprenda mi caso antes de responder.

+4

¿Ha descubierto un diseño adecuado para su sistema? Si es así, ¿puedes publicarlo aquí? Me estoy acercando a la implementación de algo similar. ¡Gracias! – mokagio

+1

Lo siento, pero después de días de buscar una solución que funciona con Symfony me rendí ... – Xuni

+2

Sí, yo también ... Implementamos un sistema personalizado simple inspirado en Symfony ACL y utilizando algunos de sus componentes básicos. Estaba personalmente muy decepcionado. – mokagio

Respuesta

1

Me doy cuenta de que esta pregunta es antigua, pero la respuesta es aplicable para Symfony 2.3+, así que lo publico aquí.

Para este enfoque, debe usar cosas como SecurityVoters.

Con los votantes de seguridad puede implementar cualquier lógica para los controles de acceso, lo que se puede imaginar.

votantes funciona como

$this->get('security.authorization_checker')->isGranted('update',$post); 

que comprobará todos los votantes, que pueden operar un puesto de entidades (véase docs) y combinar sus votos con la estrategia elegida (afirmativa, el consenso unánime) para decidir si el usuario actual está autorizado a actualizar la publicación (para su primer ejemplo de tule)

Puede implementar varios votantes para una sola acción y definir la estrategia para decidir la votación resultante.

Todos los grupos y permisos que pueda almacenar en el repositorio y traerlos con la doctrina dentro del votante.

También se puede definir el papel de la jerarquía se encargo para simplificar la seguridad funciona

leer también estos documentos en SecurityComponent

+1

Diríjase a KnpUniversity https://knpuniversity.com/screencast/new-in-symfony3/voter para obtener un breve tutorial que explica las cosas más importantes :-) – MauganRa