Πιστοποίηση της βάσης δεδομένων ενός Django χρήστη μέσω Apache¶
Επειδή το να συγχρονίζετε πολλές πιστοποιημένες βάσεις δεδομένων είναι κοινό πρόβλημα, μπορείτε να παραμετροποιήσετε τον Apache ούτως ώστε να πιστοποιήσει εκείνος απ’ ευθείας το σύστημα πιστοποίησης του Django. Αυτό απαιτεί έκδοση του Apache >= 2.2 και mod_wsgi >= 2.0. Για παράδειγμα, θα μπορούσατε να:
Εξυπηρετήσετε τα static/media αρχεία απ’ ευθείας από τον Apache, μόνο σε πιστοποιημένους χρήστες.
Πιστοποιήσετε την πρόσβαση σε ένα Subversion repository για χρήστες του Django με συγκεκριμένα δικαιώματα.
Επιτρέπετε σε συγκεκριμένους χρήστες να συνδεθούν σε ένα κοινόχρηστο WebDAV με το mod_dav.
Σημείωση
Αν έχετε εγκαταστήσει κάποιο δικό σας user model και θέλετε να χρησιμοποιήσετε τον προεπιλεγμένο auth handler, τότε το δικό σας user model θα πρέπει να υποστηρίζει το attribute is_active
. Αν θέλετε να χρησιμοποιήσετε την πιστοποίηση βάση ρόλων (group based authorization), τότε το δικό σας user model θα πρέπει να έχει μια συσχέτιση (relation) με το όνομα ‘groups’, η οποία θα αναφέρεται σε κάποιο object το οποίο θα πρέπει να έχει ένα πεδίο με το όνομα ‘name’. Μπορείτε, επίσης, να καθορίσετε τον δικό σας mod_wsgi auth handler αν βεβαίως δεν μπορείτε να συμβιβαστείτε με τις παραπάνω προϋποθέσεις.
Πιστοποίηση με το mod_wsgi
¶
Σημείωση
Η χρήση του WSGIApplicationGroup %{GLOBAL}
στις παραμετροποιήσεις παρακάτω, προϋποθέτει ότι το δικό σας instance του Apache τρέχει μόνο μια Django εφαρμογή. Αν τρέχετε παραπάνω από μια Django εφαρμογές, παρακαλούμε ανατρέξτε στην ενότητα Defining Application Groups του εγχειριδίου του mod_wsgi για περισσότερες πληροφορίες σχετικά με αυτή τη ρύθμιση.
Σιγουρευτείτε ότι το mod_wsgi είναι εγκατεστημένο, ενεργοποιημένο και έχετε ακολουθήσει τα βήματα για να εγκαταστήσετε το Apache με το mod_wsgi.
Επόμενο βήμα είναι να επεξεργαστείτε τον Apache server σας για να προσθέσετε μια τοποθεσία (location) όπου μόνο οι πιστοποιημένοι χρήστες θα μπορούν να βλέπουν:
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>
Το directive WSGIAuthUserScript
λέει στο mod_wsgi να εκτελέσει τη συνάρτηση check_password
στο προσδιορισμένο wsgi script, περνώντας το user name και το password το οποίο λαμβάνει από την είσοδο (πχ κονσόλα). Σε αυτό το παράδειγμα, το WSGIAuthUserScript
είναι το ίδιο με το WSGIScriptAlias
που ορίζει την εφαρμογή σας η οποία δημιουργήθηκε με την εντολή django-admin startproject.
Χρησιμοποιώντας τον Apache 2.2 με πιστοποίηση
Σιγουρευτείτε ότι τα modules mod_auth_basic
και mod_authz_user
είναι φορτωμένα.
Αυτά τα modules θα μπορούσαν να συγκεντρωθούν στατικά μέσα στον Apache ή θα μπορούσατε να χρησιμοποιήσετε το LoadModule για να τα φορτώσετε δυναμικά μέσα στο αρχείο httpd.conf
:
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule authz_user_module modules/mod_authz_user.so
Τέλος, επεξεργαστείτε το WSGI script σας mysite.wsgi
για να συνδέσετε την πιστοποίηση του Apache με τους μηχανισμούς πιστοποίησης του site σας, κάνοντας importing τη συνάρτηση 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()
Πλέον, τα requests που θα αρχίζουν με /secret/
θα απαιτούν πιστοποίηση από τον χρήστη.
Το mod_wsgi access control mechanisms documentation παρέχει επιπρόσθετες λεπτομέρειες και πληροφορίες σχετικά με εναλλακτικές μεθόδους πιστοποίησης.
Πιστοποίηση με το mod_wsgi
και τις ομάδες του Django¶
Το mod_wsgi προσφέρει, επίσης, τη δυνατότητα να απαγορεύει την είσοδο σε μια συγκεκριμένη τοποθεσία για κάποια μέλη μιας ομάδας.
Σε αυτή την περίπτωση, ο Apache server σας θα πρέπει να δείχνει κάπως έτσι:
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>
Για την υποστήριξη του directive WSGIAuthGroupScript
, το ίδιο WSGI script mysite.wsgi
πρέπει να κάνει import τη συνάρτηση groups_for_user
η οποία επιστρέφει μια λίστα από ομάδες στις οποίες ανήκει ο συγκεκριμένος χρήστης.
from django.contrib.auth.handlers.modwsgi import check_password, groups_for_user
Πλέον, τα requests που θα ξεκινούν με /secret/
θα απαιτούν, επίσης, από τον χρήστη να είναι μέλος της ομάδας με το όνομα “secret-agents”.