python sql permissions sqlalchemy pyramid

python - Buenas prácticas para diseñar un sistema de permisos



sql permissions (1)

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 una tabla de permisos para cada variante, pensé simplemente crear una tabla, la llamo PermissionCollection:

Colección de permisos:

  • permissionCollectionId - PrimaryKey
  • onType = ENUM ("USUARIO", "MAESTRO", "GRUPO", "CURSO" ...)
  • onId = Entero

y la tabla de Permisos:

  • permissionId - PrimaryKey
  • llave
  • valor
  • permissionCollectionId - ForeignKey

Definiré colecciones de permisos estándar para cada relación posible, codificadas en fuentes y si un usuario, curso, profesor ... tiene derechos especiales, crearé una nueva colección de permisos y le agregaré el permiso.

Soy muy 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í?


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

Cómo manejarlo, realmente solo depende de ti ... Podrías tener una tabla de ACL

(object_id, allow / deny, who? (group, userid), permission, order)

  • object_id es una identificación única para un registro en su base de datos
  • permitir / denegar es lo que se supone que debe hacer este ACE ... permitir o denegar el acceso
  • ¿quien? es un grupo, nombre de usuario o lo que quieras, por ejemplo, system.everyone is everyone
  • permiso es el parámetro de permiso en view_config
  • el orden es una cosa importante que importa 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 un registro, dejará de buscar automáticamente

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

Esto permitirá ver a cada administrador pero no a 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 tienes un árbol de datos Incluso no puedes establecer acls.

Por ejemplo, tienes un sitio que se parece a eso

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

Cuando acceda a la página 1, comprobará si hay acl si no puede encontrarlo, comprobará si el padre tiene un acl, comprobará el permiso para ello, si no lo hace, buscará su padre hasta que lo haga. alcanzar 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 ese trabajo, debes crear 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 realmente 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.

siempre que su acl esté en el atributo acl, la pirámide podrá hacer algo con él. No es realmente importante cómo lo conseguiste.

Mira esto

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