How to authenticate using REMOTE_USER
When the web server takes care of authentication it typically sets the REMOTE_USER
environment variable for use in the underlying application. In Django, REMOTE_USER
is made available in the request.META attribute. Django can be configured to make use of the REMOTE_USER
value using the RemoteUserMiddleware
or PersistentRemoteUserMiddleware
, and classes found in django.contrib.auth.
First, you must add the to the MIDDLEWARE setting after the :
Next, you must replace the ModelBackend with in the AUTHENTICATION_BACKENDS setting:
With this setup, RemoteUserMiddleware
will detect the username in request.META['REMOTE_USER']
and will authenticate and auto-login that user using the .
Django’s user management, such as the views in contrib.admin
and the createsuperuser management command, doesn’t integrate with remote users. These interfaces work with users stored in the database regardless of AUTHENTICATION_BACKENDS
.
Note
Since the RemoteUserBackend
inherits from ModelBackend
, you will still have all of the same permissions checking that is implemented in ModelBackend
.
Users with won’t be allowed to authenticate. Use AllowAllUsersRemoteUserBackend if you want to allow them to.
Warning
Be very careful if using a subclass with a custom HTTP header. You must be sure that your front-end web server always sets or strips that header based on the appropriate authentication checks, never permitting an end-user to submit a fake (or “spoofed”) header value. Since the HTTP headers X-Auth-User
and X-Auth_User
(for example) both normalize to the HTTP_X_AUTH_USER
key in request.META
, you must also check that your web server doesn’t allow a spoofed header using underscores in place of dashes.
This warning doesn’t apply to RemoteUserMiddleware
in its default configuration with header = 'REMOTE_USER'
, since a key that doesn’t start with HTTP_
in request.META
can only be set by your WSGI server, not directly from an HTTP request header.
If you need more control, you can create your own authentication backend that inherits from and override one or more of its attributes and methods.
Using REMOTE_USER
on login pages only
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.