Cómo autenticarse contra la base de datos de usuarios de Django desde Apache

Dado que mantener varias bases de datos de autenticación sincronizadas es un problema común al tratar con Apache, puedes configurar Apache para autenticarse directamente contra el sistema de autenticación de Django:doc:</topics/auth/index>. Esto requiere Apache versión >= 2.2 y mod_wsgi >= 2.0. Por ejemplo:

  • Servir archivos estáticos/media directamente desde Apache solo a usuarios autenticados.

  • Autenticar el acceso a un repositorio de Subversion contra los usuarios de Django con cierta permiso.

  • Permitir que ciertos usuarios se conecten a una partición WebDAV creada con mod_dav.

Nota

Si has instalado un modelo de usuario personalizado:ref:<auth-custom-user> y deseas utilizar este manejo de autenticación por defecto, debe soportar la atributo is_active. Si deseas utilizar autorización basada en grupos, tu modelo de usuario personalizado debe tener una relación llamada “groups”, que se refiere a un objeto relacionado con un campo “name”. También puedes especificar tu propio manejo de autenticación personalizado de mod_wsgi si tu modelo no puede cumplir con estas requisitos.

Autenticación con mod_wsgi

Nota

El uso de WSGIApplicationGroup %{GLOBAL} en las configuraciones a continuación supone que tu instancia de Apache solo está ejecutando una aplicación Django. Si estás ejecutando más de una aplicación, por favor consulta la sección Defining Application Groups del documento de mod_wsgi para obtener más información sobre esta configuración.

Asegúrate de que mod_wsgi esté instalado y activo y de que hayas seguido los pasos para configurar Apache con mod_wsgi:doc:</howto/deployment/wsgi/modwsgi>.

A continuación, edita la configuración de Apache para agregar una ubicación a la que solo los usuarios autenticados puedan acceder:

WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py
WSGIPythonPath /path/to/mysite.com

WSGIProcessGroup %{GLOBAL}
WSGIApplicationGroup %{GLOBAL}

<Location "/secret">
    AuthType Basic
    AuthName "Top Secret"
    Require valid-user
    AuthBasicProvider wsgi
    WSGIAuthUserScript /path/to/mysite.com/mysite/wsgi.py
</Location>

La traducción de los textos es la siguiente:

El uso de Apache 2.2 con autenticación

Asegúrate de que estén cargados mod_auth_basic y mod_authz_user.

Estos podrían estar compilados estáticamente en Apache, o podrías necesitar utilizar LoadModule para cargarlos dinámicamente en tu httpd.conf:

LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule authz_user_module modules/mod_authz_user.so

Finalmente, edita tu script WSGI mysite.wsgi para vincular la autenticación de Apache con las mecánicas de autenticación de tu sitio importando la función check_password:

import os

os.environ["DJANGO_SETTINGS_MODULE"] = "mysite.settings"

from django.contrib.auth.handlers.modwsgi import check_password

from django.core.handlers.wsgi import WSGIHandler

application = WSGIHandler()

Las solicitudes que comiencen con /secret/ ahora requerirán que un usuario se autentique.

La documentación sobre los mecanismos de control de acceso de mod_wsgi `_ proporciona detalles adicionales e información sobre métodos alternativos de autenticación.

Autenticación con mod_wsgi y grupos Django

mod_wsgi también proporciona funcionalidad para restringir una ubicación particular a miembros de un grupo.

En este caso, la configuración Apache debería ser como esta:

WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py

WSGIProcessGroup %{GLOBAL}
WSGIApplicationGroup %{GLOBAL}

<Location "/secret">
    AuthType Basic
    AuthName "Top Secret"
    AuthBasicProvider wsgi
    WSGIAuthUserScript /path/to/mysite.com/mysite/wsgi.py
    WSGIAuthGroupScript /path/to/mysite.com/mysite/wsgi.py
    Require group secret-agents
    Require valid-user
</Location>

Para apoyar la directiva WSGIAuthGroupScript, el mismo script WSGI mysite.wsgi debe importar también la función groups_for_user, que devuelve una lista de grupos a los que pertenece el usuario dado.

from django.contrib.auth.handlers.modwsgi import check_password, groups_for_user

Las solicitudes para /secret/ requerirán ahora que el usuario sea miembro del grupo «agentes-secretos».