2012-04-17 9 views
5

Actualmente estoy desarrollando un pequeño sitio web de Python usando Pyramid.
Pero no sé cómo diseñar el sistema de permisos.
El sistema debe ser muy flexible: tengo que establecer conexiones entre muchas tablas diferentes.
En lugar de escribir la mesa una autorización para cada variante pensé que acaba de crear una mesa - Me llaman PermissionCollection:Mejores prácticas para diseñar un sistema de permisos

PermissionCollection:

  • permissionCollectionId - PrimaryKey
  • onType = ENUM ("Usuario", "Maestro", "GRUPO", "de" ...)
  • ONID = entero

y la mesa de permiso:

  • permissionId - PrimaryKey
  • clave
  • valor
  • permissionCollectionId - ForeignKey

voy a definir PermissionCollections estándar para cada posible relación no modificable en las fuentes y si un usuario, por supuesto , profesor ... tiene derechos especiales, crearé una nueva Colección de Permisos y le agregaré el permiso.

Soy nuevo en la programación web y no sé si este enfoque es útil. O si algo como esto existe. Creo que la ACL de Pyramid no es la herramienta adecuada para esta tarea, ¿o sí?

+0

más RDBMS tiene un comando 'GRANT' /' REVOKE' que se utiliza para permitir el acceso (en varios niveles) para mesas/esquemas en la base de datos. Algunos incluso tienen el concepto de grupos de usuarios, lo que significa que puedes hacer el comando para todo el grupo. De modo que podría intentar hacer algo en el nivel de la aplicación, que ya está presente en el nivel de la base de datos (que sería mucho más seguro). –

+0

¿Pero no es GRANT para los usuarios de mi base de datos? Y el usuario de mi aplicación no significa que el usuario de la base de datos –

+0

'GRANT' _es_ para los usuarios de la base de datos, sí. Pero si escribió su aplicación para verificar los permisos (en función de quién/qué inició sesión en la aplicación), también puede iniciar sesión como un usuario de base de datos específico (puede proporcionarlos en la cadena de conexión, normalmente). Lo cual ayudaría con la auditoría, así como también controlaría el acceso. –

Respuesta

4

No estoy seguro si ya lo leyó, pero la pirámide viene con un sistema de permisos realmente bueno. Autorización con ACL.

cómo manejar la situación, en realidad, sólo depende de ti ... Usted podría tener una tabla de ACL

(object_id, permitir/denegar, ¿quién? (Grupo, identificador de usuario), el permiso, orden)

  • object_id es un identificador único a un registro en su base de datos
  • permitir/denegar es lo que se supone que esto ACE que hacer ... permitir o denegar el acceso
  • quién? es o bien un grupo, nombre de usuario o como se quiera, por ejemplo, está todo el mundo system.everyone
  • permiso es el parámetro de permiso en view_config
  • orden es una orden Lo importante no importa

Por ejemplo

__acl__ = [ 
(Deny, Everyone, 'view'), 
(Allow, 'group:admin', 'view') 
] 

Esta muestra siempre negará la vista incluso para el administrador ... Tan pronto como la pirámide encuentre algo que le indique si puede ver o no ver un registro, dejará de buscar automáticamente

__acl__ = [ 
(Allow, 'group:admin', 'view'), 
(Deny, Everyone, 'view') 
] 

Esto permitirá la vista para cada administrador pero no para nadie más.Es por eso que debe recordar el orden de sus ACE.

La parte divertida está aquí en realidad. Esto está todo bien. Tienes acl mapeado a un registro en tus datos. Cuando carga, por ejemplo, una página ... Deberá cargar el acl y configurarlo en su objeto.

myobject.__acl__ = load_acls(myobject) 

Si tiene un árbol de datos. Incluso no puedes establecer acls.

Por ejemplo, usted tiene un sitio que parece que

root 
    \--pages with acl 
     +---- page1 without acl 
     \---- page2 with acl 

Cuando se accede a la Página 1, se comprobará si hay acl si no lo encuentra, se comprobará padre si padre tiene un acl, comprobará el permiso para ello, si no comprobará su padre hasta llegar a la raíz. Si no puede encontrar el permiso, no estoy tan seguro de lo que sucede ... Supongo que le dará un error prohibido o un error de predicado. Que no puede encontrar la vista correcta.

Dicho esto, para hacer que funcione hay que hacer un objeto que conozca la ubicación que conozca a sus padres.

¿Pero por qué querrías hacer todo eso?

Puede tener acl para cualquier objeto y tener un control muy detallado sobre quién puede ver o no cada objeto en su base de datos. También puede poner acl directamente en su objeto de clase sin base de datos.

mientras su acl esté en el atributo acl pyramid podrá hacer algo al respecto. No es realmente importante cómo lo conseguiste.

mira esto

http://pyramid.readthedocs.org/en/1.3-branch/tutorials/wiki/authorization.html

+0

Agradable. gracias. ¿Y también podría usar mi mesa? En su enfoque: ¿cómo puede la aplicación averiguar si quién: 1 significa usuario con identificación 1, un grupo con identificación 1? Entonces, solo escribo una función que genera esta tupla acl para cada elemento en el árbol transversal. ¿Puedo cargar el acl en el contructor? –

+0

¿Cuál es el propósito de oder? –

+0

Sí, puedes cargar el acl en cualquier lugar siempre que tu instancia como __acl__ se establezca en una lista de tupla (ACE). –

Cuestiones relacionadas