# Τεκμηρίωση του Django - 1.10.7

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