# documentación de Django - 3.2.11.dev

# Autenticación con el uso de `REMOTE_USER`

Este documento describe como hacer uso de los recursos de autenticación remota (donde el servidor web define la variable de entorno `REMOTE_USER`) en sus aplicaciones Django. Este tipo de solución de autenticación es típicamente vista en sitios de intranet con soluciones simples de ingreso como IIS con Integrated Windows Authentication o apache con mod_authnz_ldap, CAS, Cosign, WebAuth, mod_auth_sspi, etc.

Cuando el servidor web se ocupa de la autenticación, típicamente define la variable de ambiente `REMOTE_USER` para el uso subyacente en la aplicación. En Django, `REMOTE_USER` está disponible en el atributo `request.META`. Django puede ser configurado para hacer uso del valor de `REMOTE_USER` usando el `RemoteUserMiddleware` o el `PersistentRemoteUserMiddleware` y las clases `RemoteUserBackend` encontradas en `django.contrib.auth`.

## Configuración

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

    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`:

    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`.

Nota

Como `RemoteUserBackend` hereda de `ModelBackend`, todavía tendrá la misma comprobación de permisos implementada en `ModelBackend`.

Usuarios con `is_active=False` no serán capaces de autenticarse. Use `AllowAllUsersRemoteUserBackend` si quiere permitirles hacerlo.

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:

    from django.contrib.auth.middleware import RemoteUserMiddleware

    class CustomHeaderMiddleware(RemoteUserMiddleware):
        header = 'HTTP_AUTHUSER'

Advertencia

Sea muy cuidadoso al usar una subclase de `RemoteUserMiddleware` con un encabezado HTTP personalizado. Debe asegurarse que su servidor web siempre defina o separe ese encabezado basado en las validaciones apropiadas de autenticación, nunca permitiendo que un usuario final envíe un encabezado falso (o envenenado). Desde que los encabezados HTTP `X-Auth-User` y `X-Auth_User` (por ejemplo) se normalizan en la llave `HTTP_X_AUTH_USER` de `request.META`, usted debe verificar que el servidor web no permita encabezados envenenados usando guiones bajos en lugar de guiones.

Esta advertencia no se aplica a `RemoteUserMiddleware` en su configuración por omisión con `header = 'REMOTE_USER'`, pues las llaves de `request.META` que no comiencen con `HTTP_` solo pueden ser establecidas por el servidor WSGI, no directamente desde una cabecera de petición HTTP.

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 solamente

The `RemoteUserMiddleware` authentication middleware assumes that the HTTP request header `REMOTE_USER` is present with all authenticated requests. That might be expected and practical when Basic HTTP Auth with `htpasswd` or similar mechanisms are used, but with Negotiate (GSSAPI/Kerberos) or other resource intensive authentication methods, the authentication in the front-end HTTP server is usually only set up for one or a few login URLs, and after successful authentication, the application is supposed to maintain the authenticated session itself.

`PersistentRemoteUserMiddleware` provides support for this use case. It will maintain the authenticated session until explicit logout by the user. The class can be used as a drop-in replacement of `RemoteUserMiddleware` in the documentation above.