Validar usuarios locales en Zope -> SimpleUserfolder + CookieCrumbler
Antes que nada, comentar que toda la información de usuarios en Zope se guarda en una carpeta especial llamada "acl_users" (UserFolder), en la que por defecto se guardan usuarios/passwords sin encriptar, aunque existe la posibilidad de encriptar estos passwords accediendo a las propiedades del UserFolder.
Bien, otro comentario de entrada es que, como os habreis fijado, Zope utiliza autenticación básica (Popup de usuario/password) para validar a los usuarios dentro del entorno, cosa bastante engorrosa. Hay alguien capaz de explicarme por qué razón se sigue mantiendo este esquema de validacion? :P
Y ahora entramos de lleno en lo que nos interesa, autenticar usuarios propios del sistema mediante un sistema de formularios y cookies.
El cambio de autenticación básica a autenticación mediante formulario/cookies es muy sencillo de conseguir, como sabrás existe el producto CookieCrumbler que nos ofrece esta funcionalidad de una manera muy sencilla. La URL del CookieCrumbler es la siguiente:
Al instalar un CookieCrumbler en una carpeta estamos cambiando el método de autenticación de usuarios en esa carpeta y todas las que estén por debajo de ella. Si entramos en la configuración del objecto "login" (CookieCrumbler), veremos que podemos definir la plantilla que debe mostrar en el momento de la validación y la que debe mostrar en el momento del Logout, generalmente será la misma.
Una vez conseguida la autenticación por formulario, existe alguna manera de autenticar usuarios externos a Zope y que no estén necesariamente almacenados en la base de datos ZODB? Sí, la solución que yo propongoe es SimpleUserFolder:
http://www.zope.org/Members/NIP/SimpleUserFolder
SimleUserFolder es una nueva UserFolder que nos permite personalizar los métodos de acceso a los usuarios mediante una serie de funciones:
- getUserNames(). Esta función debe devolver todos los usuarios que existen en la carpeta.
- addUser(username, passwd, roles). Esta función debe añadir un nuevo usuario en la carpeta de usuarios (si es que nos hace falta).
- deleteUser(username). Debe borrar el usuario que se le pasa como parámetro. También sólo hay que definirla si realmente nos hace falta.
- editUser(username, passwd, roles). Supongo que ya te lo imaginas lo que debe hacer esta función.
- getUserDetails(username). Y esta es una de las funciones más importantes. Tiene que devolver toda la información de un usuario a partir de su username, y esto es un diccionario con el password y los roles del usuario.
Bien, pues todas estas funciones deberemos definirlas en la carpeta padre donde esté almacenado nuestro simpleUserFolder, para que pueda acceder a ellas. Dado que queremos validar a usuarios locales, la única manera de ejecutar código python fuera del entorno Zope son los ExternalMethods. Qué haremos pues? Está claro, nos creamos un script python en $HOME/Extensions que se llame auth.py (por ejemplo), con este contenido:
http://zope-es.aditel.org/Members/vrubert/auth.py/document_view
Como veis las 2 funciones principales son las 2 últimas. La primera devuelve una lista con todos los usuarios existentes en el sistema (a partir del /etc/passwd), y la segunda devuelve un diccionario con la información de password/roles asociada a un determinado usuario.
Hasta aquí bien? Pues ahora la parte complicada. :) Como el zope no lleva soporte de autenticación MD5 por defecto, y ésta es la que utilizan la práctica totalidad de distribuciones LINUX actuales, tenemos que incorporar esta funcionalidad al zope.
El módulo de autenticación MD5 lo obtenemos de aquí: http://www.sabren.net/code/python/crypt/md5crypt.py
Y ahora tenemos que parchear el código fuente del zope, concretamente este fichero:
lib/python/AccessControl/AuthEncoding.py
Y el parche sería el siguiente:
http://zope-es.aditel.org/Members/vrubert/AuthEncoding.py.patch/document_view
Dudas y comentarios?