Come autenticare da Apache verso il database utenti di Django

Dal momento che mantenere più database di autenticazione sincronizzati è un problema comune quando si ha a che fare con Apache, è possibile configurare Apache in modo che si autentichi direttamente sul sistema di autenticazione di Django. Questo richiede la versione di Apache >= 2.2 e mod_wsgi >= 2.0. Ad esempio, potresti:

  • Distribuire files static/media direttamente da Apache solo ad utenti autenticati.
  • Autenticare l’accesso un repository Subversion per gli utenti Django con un certo permesso.
  • Permettere ad alcuni utenti di connettersi ad una condivisione WebDAV creata con mod_dav.

Nota

Se hai installato un modello utente personalizzato e vuoi utilizzare questo gestore di autenticazione predefinito, deve supportare un attributo is_active. Se desideri utilizzare l’autorizzazione basata su gruppi, il tuo utente personalizzato deve avere una relazione denominata “gruppi”, che fa riferimento ad un oggetto correlato che ha un campo “nome”. Puoi anche specificare il tuo gestore di autenticazione mod_wsgi personalizzato se per consuetudine non puoi conformarti a questi requisiti.

Autenticazione con mod_wsgi

Nota

L’uso di WSGIApplicationGroup %{GLOBAL} nella configurazione qui sotto presume che la tua istanza di Apache stia facendo girare una sola applicazione Django. Se stai facendo girare più di una applicazione Django, fai riferimento alla sezione Definire Gruppi di Applicazioni della documentazione mod_wsgi per avere più informazioni su questa impostazione.

Assicurati che mod_wsgi sia installato ed attivato e che tu abbia seguito gli step per impostare Apache con mod_wsgi.

Ora, modifica la tua configurazione di Apache per aggiungere una cartella che vuoi sia visibile solo ad utenti autenticati:

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>

La direttiva WSGIAuthUserScript dice a mod_wsgi di eseguire la funzione check_password nello script wsgi specificato, passando il nome utente e la password che riceve dal prompt. In questo esempio, WSGIAuthUserScript è lo stesso di WSGIScriptAlias che definisce la tua applicazione creata da django-admin startproject.

Utilizzo di Apache 2.2 con autenticazione

Controlla bene che mod_auth_basic e mod_authz_user siano caricati

Queste possono essere compilate staticamente in Apache, o potresti aver bisogno di usare LoadModule per caricarle dinamicamente nel tuo httpd.conf:

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

Infine, modifica il tuo script WSGI mysite.wsgi per legare l’autenticazione di Apache ai meccanismi di autenticaizione del tuo sito importando la funzione 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()

Le richieste che iniziano con /secret/ richiederanno un utente per l’autenticazione

La documentazione sui meccanismi di controllo di accesso di mod_wsgi offre dettagli aggiuntivi ed informazioni riguardo a metodi alternativi di autenticazione.

Autorizzazione con mod_wsgi e gruppi Django

mod_wsgi fornisce anche funzionalita di restringere una location particolare a un membro del gruppo.

In questo caso, la configurazione di Apache dovrebbe essere cosi :

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>

Per supportare la direttiva WSGIAuthGroupScript, lo stesso script WSGI mysite.wsgi deve anche importare la funzione groups_for_user che restituisce una lista di gruppi a cui un dato utente appartiene.

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

Le richieste di /secret/ renderanno necessario che l’utente faccia parte del gruppo «secret-agents»-

Back to Top