Mit Apache an Djangos Benutzerdatenbank authentifizieren
Diese Dokumentation gilt für Djangos Entwicklerversion, die zum Teil erhebliche Unterschiede zur letzten veröffentlichen Version aufweist.
Da es ein übliches Problem bei Apache ist, mehrere Authentifizierungs-Datenbanken synchron zu halten, kannst du Apache so konfigurieren, dass er sich direkt an Djangos Authenzifizierungssystem anmeldet. So kannst du z. B.
- statische Dateien/Mediendateien direkt von Apache aus und nur an bestätigte Benutzer liefern.
- Zugriff zu einem Subversion-Repository an Django-Benutzer mit bestimmten Rechten zulassen.
- bestimmten Benutzern erlauben, sich mit einer WebDAV-Freigabe, die mit mod_dav erzeugt wurde, zu verbinden.
Apache konfigurieren
Damit sich eine Apache-Konfigurationsdatei gegenüber Djangos Berechtigungsdatenbank abgleichen kann, musst du die PythonAuthenHandler-Direktive von mod_python zusammen mit den Standard-Direktiven Auth* und Require benutzen:
<Location /example/>
AuthType Basic
AuthName "example.com"
Require valid-user
SetEnv DJANGO_SETTINGS_MODULE mysite.settings
PythonAuthenHandler django.contrib.auth.handlers.modpython
</Location>
Benutzung des Auth-Handlers mit Apache 2.2
Wenn du Apache 2.2 nutzt, wirst du einige extra Schritte erledigen müssen.
Du musst sicherstellen, dass mod_auth_basic und mod_authz_user geladen sind. Diese können statisch in Apache kompiliert sein oder es kann erforderlich sein, dass du LoadModule benutzt, um sie dynamisch zu laden (wie im Beispiel unten zu sehen).
Es ist außerdem nötig, dass du Konfigurations-Direktiven einfügst, die Apache daran hindern, zu versuchen, andere Authentifikations-Module zu benutzen. Abhängig davon, welche Authentifikations-Module du geladen hast, brauchst du möglicherweise eine oder mehrere der folgenden Direktiven:
AuthBasicAuthoritative Off AuthDefaultAuthoritative Off AuthzLDAPAuthoritative Off AuthzDBMAuthoritative Off AuthzDefaultAuthoritative Off AuthzGroupFileAuthoritative Off AuthzOwnerAuthoritative Off AuthzUserAuthoritative Off
Eine vollständige Konfiguration, mit Unterschieden zwischen Apache 2.0 und Apache 2.2 fett markiert, würde so ähnlich aussehen:
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule authz_user_module modules/mod_authz_user.so
...
<Location /example/>
AuthType Basic
AuthName "example.com"
AuthBasicAuthoritative Off
Require valid-user
SetEnv DJANGO_SETTINGS_MODULE mysite.settings
PythonAuthenHandler django.contrib.auth.handlers.modpython
</Location>
Standardmäßig beschränkt der Auth-Handler den Zugriff zu /example/ auf Benutzer, die als Mitarbeiter (engl.: Staff) markiert sind. Du kannst eine Reihe von PythonOption-Direktiven benutzen, um dieses Verhalten zu ändern:
| PythonOption | Erklärung |
|---|---|
| DjangoRequireStaffStatus | Wenn auf on gestellt, werden nur “Staff”-Benutzer (z. B. Benutzer mit der Markierung is_staff) zugelassen. Standard ist on. |
| DjangoRequireSuperuserStatus | Wenn auf on gestellt, werden nur Superuser (z. B. Benutzer mit der Markierung ìs_superuser) zugelassen. Standard ist off. |
| DjangoPermissionName | Der Name einer Genehmigung, die für den Zugriff benötigt wird. Siehe auch Individuelle Genehmigungen für weitere Informationen. Standardmäßig wird keine spezifische Genehmigung benötigt. |
Es ist zu beachten, dass SetEnv manchmal nicht gut mit mod_python funktioniert, die Gründe dafür sind unbekannt. Wenn du Probleme damit hast, dass mod_python dein DJANGO_SETTINGS_MODULE nicht erkennt, kannst du es so einstellen, dass es PythonOption anstelle von SetEnv benutzt. Daher sind diese beiden Apache-Direktiven gleichwertig:
SetEnv DJANGO_SETTINGS_MODULE mysite.settings PythonOption DJANGO_SETTINGS_MODULE mysite.settings