Member of The Internet Defense League Últimos cambios
Últimos Cambios
Blog personal: El hilo del laberinto Geocaching

Autentificación y autorización con mod_python

Última Actualización: 13 de Febrero de 2003 - Jueves

mod_python es un interesante proyecto que permite integrar scripts Python en Apache. Y no sólo como medio para acelerar la ejecución de scripts Python a modo de CGI, sino también para definir "handlers" internos de Apache.

En este artículo describiré cómo implementar un "handler" Python de autentificación y autorización para Apache 1.3.*, con la característica especial de que las claves de acceso de los usuarios sólo son válidas en un intervalo horario determinado.

Antes de pasar a la "chicha", me gustaría concretar los términos "autentificación" y "autorización":

  • Autentificación: Con este mecanismo confirmamos la identidad de un usuario.

  • Autorización: Una vez identificado el usuario en cuestión, se determina sus permisos de acceso.

Veamos el código fuente en sí:

# Autentificacion controlada por horarios
# y con acceso directorio a directorio

from mod_python import apache

# Autorizacion
def authzhandler(request) :
  return verifica_usuario(request)

# Autentificacion
def authenhandler(request) :
  return verifica_usuario(request)


def verifica_usuario(request) :
  try :
    usuarios={"Usuario1":("Clave1","Comentario1"),
              "Usuario2":("Clave2","Comentario2"),}

    # Para que nos de el usuario, primero hay que pedir la clave
    clave=request.get_basic_auth_pw()
    usuario=request.connection.user

    if not usuarios.has_key(usuario) : return apache.HTTP_UNAUTHORIZED
    if usuarios[usuario][0]!=clave : return apache.HTTP_UNAUTHORIZED
    import time
    now=time.localtime()
    tiempo_minimo=(2002, 12, 10, 8, 0) # Hora local
    tiempo_maximo=(2002, 12, 17, 8, 0) # Hora local
    if (now<tiempo_minimo) or (now>tiempo_maximo) : return apache.HTTP_UNAUTHORIZED

    return apache.OK
  except :
    # Si ocurre algo raro, nos curamos en salud
    return apache.HTTP_UNAUTHORIZED

El script es evidente y poco hay que comentar, salvo:

  • Para poder tener acceso al nombre de usuario, hay que invocar primero a "request.get_basic_auth_pw()", tal y como se describe en la documentación de Apache.

  • En cada petición el script se ejecuta dos veces: una vez para autentificar y otra para autorizar. Esto no tiene por qué ser así. Se puede dividir la lógica, pero en este caso concreto me ha parecido más sencillo hacerlo así, tras algunas pruebas y errores.

En cuanto a la configuración Apache en sí, hay que añadir lo siguiente:

<Directory el que sea>
Auth_MySQL      off
PythonAuthenHandler     nombre del script de autentificación/autorización
PythonAuthzHandler      nombre del script de autentificación/autorización
AuthType        Basic
AuthName        Realm que queramos usar
#AuthUserFile   "/dev/null"
#AuthGroupFile  "/dev/null"
#AuthAuthoritative      off
require user
</Directory>

El único detalle a señalar aquí es deshabilitar la autentificación vía MySQL para que no se peguen entre ellas. Si no usas el módulo de autentificación MySQL, no necesitas esa línea de configuración.

De hecho, con la flexibilidad de mod_python y este modulillo, tengo pendiente eliminar el módulo de autentificación MySQL y sustituirlo por un módulo Python que haga la consulta directamente a la base de datos, sin módulos adicionales. Eso sería infinitamente más flexible.


Historia

  • 13/Feb/03: Primera versión de este documento.



Python Zope ©2003 jcea@jcea.es

Más información sobre los OpenBadges

Donación BitCoin: 19niBN42ac2pqDQFx6GJZxry2JQSFvwAfS