7

Soy parte de un equipo que crea una aplicación web usando PHP y MySQL. La aplicación tendrá múltiples usuarios con diferentes roles. La aplicación también se usará de forma distribuida geográficamente. En consecuencia necesitamos crear un sistema de control de acceso que opera en los dos niveles siguientes:PHP Access Control System

  1. permisos controles de usuario para páginas php específicos es decir, proporciona o deniega el acceso a páginas específicas (o elementos de interfaz de usuario) en base a la función del usuario. Por ejemplo: un usuario puede tener acceso a la página "Estudiantes" pero no a la página "Maestros".
  2. Controla los permisos de usuario para registros de bases de datos específicos, es decir, modifica las consultas de la base de datos para que solo se muestren registros específicos. Por ejemplo, para un usuario a nivel de la ciudad, solo deben mostrarse los registros que se relacionan con la ciudad particular del usuario, mientras que para un usuario a nivel nacional, se deben mostrar los registros de TODAS LAS CIUDADES del país.

Necesito ayuda para diseñar un sistema que pueda manejar ambos tipos de control de acceso. Punto no. 1 parece ser lo suficientemente simple. Sin embargo, estoy completamente perdido sobre cómo hacer el punto número 2 sin codificar la información en las consultas SQL.

Cualquier ayuda sería apreciada.

Gracias de antemano

Vinayak

Respuesta

12

Estuve en una situación similar hace unos meses. Descubrí que las herramientas como Zend_ACL funcionan muy bien si solo se comprueba el nivel de acceso a un solo elemento (o un número razonablemente bajo de ellos). Falla cuando necesita obtener una gran lista de elementos a los que el usuario puede acceder. Diseñé una solución personalizada para este problema usando el patrón Business Delegate. BD proporciona lógica comercial que se puede aplicar en un contexto específico.En este escenario, se entregó una lógica SQL y se utilizó como condición de filtrado en subselección. Consulte los siguientes diagramas:

alt text http://gruz.epsi.pl/g/uml/permissions.png

Y secuencia diagrama que ilustra las llamadas orden:

alt text http://gruz.epsi.pl/g/uml/permissions-s2.png

I blogged about this solution, por desgracia, es todo en polaco, pero es posible encontrar piezas de código y diagramas práctico. Lo que puedo decir es que la implementación no es fácil, pero en lo que se refiere al rendimiento, es un campeón en comparación con la verificación de acceso iterativo para cada elemento de la lista. Además, la infraestructura anterior maneja no solo un tipo de elementos en la lista. Puede servir cuando se accede a listas diferentes, ya sea una lista de ciudades, países, productos o documentos, siempre que los elementos de la lista implementen la interfaz IAuthorizable.

+0

Hola, sé que es una respuesta antigua, pero necesito una aclaración sobre el [diagrama de clase UML] (http://en.wikipedia.org/wiki/Class_diagram), ¿qué significan los diferentes tipos de flechas ?, sólido, discontinuo y gris) – Triztian

+1

@Triztian - Las líneas sólidas con flechas son llamadas a métodos, líneas verticales discontinuas representan líneas de vida, y las líneas horizontales discontinuas a menudo representan un retorno –

1

no sabe acerca de los detalles de su problema, pero el Zend Framework tiene un lugar potente ACL y AUTH conjunto de componentes que puede que desee ver. Buenas cosas como control de acceso muy preciso, almacenamiento de datos para persistencia, reglas condicionales avanzadas.

1

Me parece como lo que se necesita es la siguiente: (Voy a usar un estado ejemplo de la ciudad país//)

  1. Una lista de todos los países. Cada "país" tiene una identificación.
  2. Una lista de todos los estados dentro de los países. Cada estado está vinculado a la ID de coutnry, pero también tiene su propia identificación única.
  3. Una lista de todas las ciudades. Cada ciudad está vinculada a un estado, o directamente a un país, y tiene una bandera para indicar cuál.

Para un usuario de la ciudad, obviamente busque y muestre solo aquellos registros pertenecientes a la ciudad que coincida con su ID. Sin embargo, para un nivel estatal o nacional, busque todos los registros correspondientes a cada ciudad que tenga una identificación que coincida con esa nación (o estado o lo que sea).

Así que, básicamente, cada subgrupo depende del grupo que se encuentra sobre él, y aunque no recuerdo correctamente, creo que puede usar subconsultas para hacer el truco desde allí.

+0

Hola Pero esto significa que las consultas de búsqueda deben escribirse de manera diferente para cada nivel de usuario. Mi problema es encontrar la manera de hacer que la misma consulta devuelva un conjunto diferente de resultados según el nivel del usuario. – Vinayak

+0

@ vinayak.myopenid.com, Debería utilizar una consulta diferente de todos modos si le permitiera saber al servidor SQL qué nivel de acceso tiene. Parece que los permisos se manejarían atacando expresiones en una cláusula WHERE con AND. Suena bastante simple. – strager

0

Si no sabes cómo hacerlo, utilizaría un framework de php como Zend Framework, CakePHP o Symphony. Han hecho todo el trabajo pesado por usted y tienen algún tipo de esquema de control de acceso ya implementado.

0

Tengo una solución similar para construir y hasta ahora he decidido usar especificaciones y roles, por lo que de hecho, una función tendría adjuntas algunas especificaciones de privilegios. Si todos están satisfechos, el permiso se concede; de ​​lo contrario, vuelve al acceso predeterminado del recurso.

Estaba mirando para encontrar a alguien que ya estaba implementando la solución, pero parece que nadie lo hizo. Esperemos que no sea un error :)

Cuestiones relacionadas