Cómo autenticarse usando REMOTE_USERLink to this heading

Este documento describe cómo hacer uso de fuentes de autenticación externas (donde el servidor web establece la variable de entorno REMOTE_USER) en sus aplicaciones Django. Este tipo de solución de autenticación se suele ver en sitios de intranet, con soluciones de inicio de sesión único como IIS y autenticación integrada de Windows o Apache y mod_authnz_ldap, CAS, Cosign, WebAuth, mod_auth_sspi, etc.

Cuando el servidor web se encarga de la autenticación, normalmente establece la variable de entorno REMOTE_USER para su uso en la aplicación subyacente. En Django, “”REMOTE_USER”” está disponible en la solicitud atributo request.META Django se puede configurar para hacer uso del valor REMOTE_USER usando las clases RemoteUserMiddleware o PersistentRemoteUserMiddleware, y RemoteUserBackend que se encuentran en :mod`”django.contrib.auth`.

ConfiguraciónLink to this heading

Primero debe agregar la clase django.contrib.auth.middleware.RemoteUserMiddleware a la configuración de MIDDLEWARE después de django.contrib.auth.middleware.AuthenticationMiddleware:

Code
MIDDLEWARE = [
    "...",
    "django.contrib.auth.middleware.AuthenticationMiddleware",
    "django.contrib.auth.middleware.RemoteUserMiddleware",
    "...",
]

Luego, debe remplazar la clase ModelBackend por RemoteUserBackend en la configuración AUTHENTICATION_BACKENDS:

Code
AUTHENTICATION_BACKENDS = [
    "django.contrib.auth.backends.RemoteUserBackend",
]

Con esta configuración, RemoteUserMiddleware detectará el usuario en request.META['REMOTE_USER'] y autenticará e iniciará automáticamente la sesión de usuario usando RemoteUserBackend.

Sea conciente de que esta configuración particular deshabilita la autenticación por defecto con el ModelBackend. Esto significa que si el valor del REMOTE_USER no está definido, entonces el usuario no será capaz de ingresar, incluso usando la interfaz de administración de Django. Agregando 'django.contrib.auth.backends.ModelBackend' a la lista de AUTHENTICATION_BACKENDS, servirá como respaldo si REMOTE_USER no está definido, lo que resolverá estas problemáticas.

El sistema de usuarios de Django, como las vistas en contrib.admin y el comando de manejo createsuperuser, no se integran con usuarios remotos. Estas interfaces trabajan con usuarios almacenados en la base de datos independientemente de AUTHENTICATION_BACKENDS.

Si su mecanismo de autenticación usa una cabecera HTTP personalizada y no REMOTE_USER, puede crear una clase hija de RemoteUserMiddleware y configurar el atributo header con la llave de request.META deseada. Por ejemplo:

Code
from django.contrib.auth.middleware import RemoteUserMiddleware


class CustomHeaderMiddleware(RemoteUserMiddleware):
    header = "HTTP_AUTHUSER"

Si necesita más control, puedes crear su propio backend de autenticación que herede de RemoteUserBackend y redefinir uno o más de sus atributos y métodos.

Usando REMOTE_USER en paginas de ingreso solamenteLink to this heading

El middleware de autenticación RemoteUserMiddleware asume que el encabezado de solicitud HTTP REMOTE_USER está presente con todas las solicitudes autenticadas. Eso podría ser esperado y práctico cuando se utiliza autenticación HTTP básica con htpasswd o mecanismos similares, pero con Negotiate (GSSAPI/Kerberos) u otros métodos de autenticación intensivos en recursos, la autenticación en el servidor HTTP front-end normalmente solo se configura para una o varias direcciones URL de inicio de sesión, y después de una autenticación correcta, se supone que la aplicación debe mantener la sesión autenticada.

PersistentRemoteUserMiddleware proporciona soporte para este caso de uso. Mantendrá la sesión autenticada hasta que el usuario cierre la sesión explícitamente. La clase se puede utilizar como un reemplazo directo de RemoteUserMiddleware en la documentación anterior.