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.
¿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
Lo siento, pero después de días de buscar una solución que funciona con Symfony me rendí ... – Xuni
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