2009-03-15 06:54:28 +01:00
|
|
|
====================================
|
|
|
|
Authentication using ``REMOTE_USER``
|
|
|
|
====================================
|
|
|
|
|
2010-10-24 19:29:24 +02:00
|
|
|
.. currentmodule:: django.contrib.auth.backends
|
2010-02-24 14:55:37 +01:00
|
|
|
|
2009-03-15 06:54:28 +01:00
|
|
|
This document describes how to make use of external authentication sources
|
|
|
|
(where the Web server sets the ``REMOTE_USER`` environment variable) in your
|
|
|
|
Django applications. This type of authentication solution is typically seen on
|
|
|
|
intranet sites, with single sign-on solutions such as IIS and Integrated
|
|
|
|
Windows Authentication or Apache and `mod_authnz_ldap`_, `CAS`_, `Cosign`_,
|
|
|
|
`WebAuth`_, `mod_auth_sspi`_, etc.
|
|
|
|
|
|
|
|
.. _mod_authnz_ldap: http://httpd.apache.org/docs/2.2/mod/mod_authnz_ldap.html
|
2009-12-26 07:37:26 +01:00
|
|
|
.. _CAS: http://www.jasig.org/cas
|
2009-03-15 06:54:28 +01:00
|
|
|
.. _Cosign: http://weblogin.org
|
|
|
|
.. _WebAuth: http://www.stanford.edu/services/webauth/
|
|
|
|
.. _mod_auth_sspi: http://sourceforge.net/projects/mod-auth-sspi
|
|
|
|
|
|
|
|
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 :attr:`request.META
|
|
|
|
<django.http.HttpRequest.META>` attribute. Django can be configured to make
|
|
|
|
use of the ``REMOTE_USER`` value using the ``RemoteUserMiddleware`` and
|
2009-05-17 18:57:50 +02:00
|
|
|
``RemoteUserBackend`` classes found in :mod:`django.contrib.auth`.
|
2009-03-15 06:54:28 +01:00
|
|
|
|
|
|
|
Configuration
|
|
|
|
=============
|
|
|
|
|
2012-12-29 16:35:12 +01:00
|
|
|
.. class:: django.contrib.auth.middleware.RemoteUserMiddleware
|
|
|
|
|
2009-03-15 06:54:28 +01:00
|
|
|
First, you must add the
|
|
|
|
:class:`django.contrib.auth.middleware.RemoteUserMiddleware` to the
|
|
|
|
:setting:`MIDDLEWARE_CLASSES` setting **after** the
|
|
|
|
:class:`django.contrib.auth.middleware.AuthenticationMiddleware`::
|
|
|
|
|
|
|
|
MIDDLEWARE_CLASSES = (
|
|
|
|
...
|
|
|
|
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
|
|
|
'django.contrib.auth.middleware.RemoteUserMiddleware',
|
|
|
|
...
|
|
|
|
)
|
|
|
|
|
|
|
|
Next, you must replace the :class:`~django.contrib.auth.backends.ModelBackend`
|
|
|
|
with ``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 user
|
|
|
|
using the ``RemoteUserBackend``.
|
|
|
|
|
|
|
|
.. note::
|
|
|
|
Since the ``RemoteUserBackend`` inherits from ``ModelBackend``, you will
|
|
|
|
still have all of the same permissions checking that is implemented in
|
|
|
|
``ModelBackend``.
|
|
|
|
|
|
|
|
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 RemoteUserMiddleware
|
|
|
|
|
|
|
|
class CustomHeaderMiddleware(RemoteUserMiddleware):
|
|
|
|
header = 'HTTP_AUTHUSER'
|
|
|
|
|
|
|
|
|
|
|
|
``RemoteUserBackend``
|
|
|
|
=====================
|
|
|
|
|
2010-10-24 19:29:24 +02:00
|
|
|
.. class:: django.contrib.auth.backends.RemoteUserBackend
|
2009-03-15 06:54:28 +01:00
|
|
|
|
|
|
|
If you need more control, you can create your own authentication backend
|
|
|
|
that inherits from ``RemoteUserBackend`` and overrides certain parts:
|
|
|
|
|
|
|
|
Attributes
|
|
|
|
~~~~~~~~~~
|
|
|
|
|
|
|
|
.. attribute:: RemoteUserBackend.create_unknown_user
|
|
|
|
|
|
|
|
``True`` or ``False``. Determines whether or not a
|
|
|
|
:class:`~django.contrib.auth.models.User` object is created if not already
|
|
|
|
in the database. Defaults to ``True``.
|
|
|
|
|
|
|
|
Methods
|
|
|
|
~~~~~~~
|
|
|
|
|
2013-09-05 11:56:03 +02:00
|
|
|
.. method:: RemoteUserBackend.authenticate(remote_user)
|
|
|
|
|
|
|
|
The username passed as ``remote_user`` is considered trusted. This method
|
|
|
|
simply returns the ``User`` object with the given username, creating a new
|
|
|
|
``User`` object if :attr:`~RemoteUserBackend.create_unknown_user` is
|
|
|
|
``True``.
|
|
|
|
|
|
|
|
Returns ``None`` if :attr:`~RemoteUserBackend.create_unknown_user` is
|
|
|
|
``False`` and a ``User`` object with the given username is not found in the
|
|
|
|
database.
|
|
|
|
|
2009-03-15 06:54:28 +01:00
|
|
|
.. method:: RemoteUserBackend.clean_username(username)
|
|
|
|
|
|
|
|
Performs any cleaning on the ``username`` (e.g. stripping LDAP DN
|
|
|
|
information) prior to using it to get or create a
|
|
|
|
:class:`~django.contrib.auth.models.User` object. Returns the cleaned
|
|
|
|
username.
|
|
|
|
|
|
|
|
.. method:: RemoteUserBackend.configure_user(user)
|
|
|
|
|
|
|
|
Configures a newly created user. This method is called immediately after a
|
|
|
|
new user is created, and can be used to perform custom setup actions, such
|
|
|
|
as setting the user's groups based on attributes in an LDAP directory.
|
|
|
|
Returns the user object.
|