Πιστοποίηση της βάσης δεδομένων ενός 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».

Back to Top