Hur man autentiserar sig mot Djangos användardatabas från Apache

Since keeping multiple authentication databases in sync is a common problem when dealing with Apache, you can configure Apache to authenticate against Django’s authentication system directly. This requires Apache version >= 2.2 and mod_wsgi >= 2.0. For example, you could:

  • Servera statiska filer/mediefiler direkt från Apache endast till autentiserade användare.

  • Autentisera åtkomst till ett Subversion-repository mot Django-användare med en viss behörighet.

  • Tillåt vissa användare att ansluta till en WebDAV-delning som skapats med mod_dav.

Observera

Om du har installerat en custom user model och vill använda denna standardautentiseringshanterare måste den stödja ett is_active-attribut. Om du vill använda gruppbaserad auktorisering måste din anpassade användare ha en relation med namnet ”groups”, som hänvisar till ett relaterat objekt som har ett ”name”-fält. Du kan också ange din egen anpassade mod_wsgi auth-hanterare om din anpassade inte kan uppfylla dessa krav.

Autentisering med mod_wsgi

Observera

Användningen av WSGIApplicationGroup %{GLOBAL} i konfigurationerna nedan förutsätter att din Apache-instans endast kör en Django-applikation. Om du kör mer än en Django-applikation, se avsnittet Defining Application Groups i mod_wsgi-dokumenten för mer information om den här inställningen.

Se till att mod_wsgi är installerat och aktiverat och att du har följt stegen för att konfigurera Apache med mod_wsgi.

Redigera sedan Apache-konfigurationen så att du lägger till en plats som endast autentiserade användare ska kunna se:

WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py
WSGIPythonPath /path/to/mysite.com

WSGIProcessGroup %{GLOBAL}
WSGIApplicationGroup %{GLOBAL}

<Location "/secret">
    AuthType Basic
    AuthName "Top Secret"
    Require valid-user
    AuthBasicProvider wsgi
    WSGIAuthUserScript /path/to/mysite.com/mysite/wsgi.py
</Location>

Direktivet WSGIAuthUserScript säger till mod_wsgi att köra funktionen check_password i det angivna wsgi-skriptet och skicka användarnamnet och lösenordet som det får från prompten. I det här exemplet är WSGIAuthUserScript detsamma som WSGIScriptAlias som definierar din applikation som skapas av django-admin startproject.

Using Apache 2.2+ with authentication

Se till att mod_auth_basic och mod_authz_user är laddade.

Dessa kan vara statiskt kompilerade i Apache, eller så kan du behöva använda LoadModule för att ladda dem dynamiskt i din httpd.conf:

LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule authz_user_module modules/mod_authz_user.so

Slutligen redigerar du ditt WSGI-skript mysite.wsgi för att knyta Apaches autentisering till din webbplats autentiseringsmekanismer genom att importera funktionen check_password:

import os

os.environ["DJANGO_SETTINGS_MODULE"] = "mysite.settings"

from django.contrib.auth.handlers.modwsgi import check_password

from django.core.handlers.wsgi import WSGIHandler

application = WSGIHandler()

Förfrågningar som börjar med /secret/ kommer nu att kräva att en användare autentiserar sig.

I mod_wsgi access control mechanisms documentation finns ytterligare detaljer och information om alternativa metoder för autentisering.

Auktorisering med mod_wsgi och Django-grupper

mod_wsgi tillhandahåller också funktionalitet för att begränsa en viss plats till medlemmar i en grupp.

I det här fallet bör Apache-konfigurationen se ut så här:

WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py

WSGIProcessGroup %{GLOBAL}
WSGIApplicationGroup %{GLOBAL}

<Location "/secret">
    AuthType Basic
    AuthName "Top Secret"
    AuthBasicProvider wsgi
    WSGIAuthUserScript /path/to/mysite.com/mysite/wsgi.py
    WSGIAuthGroupScript /path/to/mysite.com/mysite/wsgi.py
    Require group secret-agents
    Require valid-user
</Location>

För att stödja direktivet WSGIAuthGroupScript måste samma WSGI-skript mysite.wsgi också importera funktionen groups_for_user som returnerar en lista över grupper som den givna användaren tillhör.

from django.contrib.auth.handlers.modwsgi import check_password, groups_for_user

Förfrågningar om /secret/ kommer nu också att kräva att användaren är medlem i gruppen ”secret-agents”.