=========================================How to authenticate using ``REMOTE_USER``=========================================This document describes how to make use of external authentication sources(where the web server sets the ``REMOTE_USER`` environment variable) in yourDjango applications. This type of authentication solution is typically seen onintranet sites, with single sign-on solutions such as IIS and IntegratedWindows Authentication or Apache and `mod_authnz_ldap`_, `CAS`_, `Cosign`_,`WebAuth`_, `mod_auth_sspi`_, etc... _mod_authnz_ldap: https://httpd.apache.org/docs/2.2/mod/mod_authnz_ldap.html.. _CAS: https://www.apereo.org/projects/cas.. _Cosign: http://weblogin.org.. _WebAuth: https://uit.stanford.edu/service/authentication.. _mod_auth_sspi: https://sourceforge.net/projects/mod-auth-sspiWhen the web server takes care of authentication it typically sets the``REMOTE_USER`` environment variable for use in the underlying application. InDjango, ``REMOTE_USER`` is made available in the :attr:`request.META<django.http.HttpRequest.META>` attribute. Django can be configured to makeuse of the ``REMOTE_USER`` value using the ``RemoteUserMiddleware``or ``PersistentRemoteUserMiddleware``, and:class:`~django.contrib.auth.backends.RemoteUserBackend` classes found in:mod:`django.contrib.auth`.Configuration=============First, you must add the:class:`django.contrib.auth.middleware.RemoteUserMiddleware` to the:setting:`MIDDLEWARE` setting **after** the:class:`django.contrib.auth.middleware.AuthenticationMiddleware`::MIDDLEWARE = ['...','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.auth.middleware.RemoteUserMiddleware','...',]Next, you must replace the :class:`~django.contrib.auth.backends.ModelBackend`with :class:`~django.contrib.auth.backends.RemoteUserBackend` in the:setting:`AUTHENTICATION_BACKENDS` setting::AUTHENTICATION_BACKENDS = ['django.contrib.auth.backends.RemoteUserBackend',]With this setup, ``RemoteUserMiddleware`` will detect the username in``request.META['REMOTE_USER']`` and will authenticate and auto-login that userusing the :class:`~django.contrib.auth.backends.RemoteUserBackend`.Be aware that this particular setup disables authentication with the default``ModelBackend``. This means that if the ``REMOTE_USER`` value is not setthen the user is unable to log in, even using Django's admin interface.Adding ``'django.contrib.auth.backends.ModelBackend'`` to the``AUTHENTICATION_BACKENDS`` list will use ``ModelBackend`` as a fallbackif ``REMOTE_USER`` is absent, which will solve these issues.Django's user management, such as the views in ``contrib.admin`` andthe :djadmin:`createsuperuser` management command, doesn't integrate withremote users. These interfaces work with users stored in the databaseregardless of ``AUTHENTICATION_BACKENDS``... note::Since the ``RemoteUserBackend`` inherits from ``ModelBackend``, you willstill have all of the same permissions checking that is implemented in``ModelBackend``.Users with :attr:`is_active=False<django.contrib.auth.models.User.is_active>` won't be allowed toauthenticate. Use:class:`~django.contrib.auth.backends.AllowAllUsersRemoteUserBackend` ifyou want to allow them to.If your authentication mechanism uses a custom HTTP header and not``REMOTE_USER``, you can subclass ``RemoteUserMiddleware`` and set the``header`` attribute to the desired ``request.META`` key. For example::from django.contrib.auth.middleware import RemoteUserMiddlewareclass CustomHeaderMiddleware(RemoteUserMiddleware):header = 'HTTP_AUTHUSER'.. warning::Be very careful if using a ``RemoteUserMiddleware`` subclass with a customHTTP header. You must be sure that your front-end web server always sets orstrips that header based on the appropriate authentication checks, neverpermitting an end-user to submit a fake (or "spoofed") header value. Sincethe HTTP headers ``X-Auth-User`` and ``X-Auth_User`` (for example) bothnormalize to the ``HTTP_X_AUTH_USER`` key in ``request.META``, you mustalso check that your web server doesn't allow a spoofed header usingunderscores in place of dashes.This warning doesn't apply to ``RemoteUserMiddleware`` in its defaultconfiguration with ``header = 'REMOTE_USER'``, since a key that doesn'tstart with ``HTTP_`` in ``request.META`` can only be set by your WSGIserver, not directly from an HTTP request header.If you need more control, you can create your own authentication backendthat inherits from :class:`~django.contrib.auth.backends.RemoteUserBackend` andoverride one or more of its attributes and methods... _persistent-remote-user-middleware-howto:Using ``REMOTE_USER`` on login pages only=========================================The ``RemoteUserMiddleware`` authentication middleware assumes that the HTTPrequest header ``REMOTE_USER`` is present with all authenticated requests. Thatmight be expected and practical when Basic HTTP Auth with ``htpasswd`` orsimilar mechanisms are used, but with Negotiate (GSSAPI/Kerberos) or otherresource intensive authentication methods, the authentication in the front-endHTTP server is usually only set up for one or a few login URLs, and aftersuccessful authentication, the application is supposed to maintain theauthenticated session itself.:class:`~django.contrib.auth.middleware.PersistentRemoteUserMiddleware`provides support for this use case. It will maintain the authenticated sessionuntil explicit logout by the user. The class can be used as a drop-inreplacement of :class:`~django.contrib.auth.middleware.RemoteUserMiddleware`in the documentation above.