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
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). –
¿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 –
'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. –