2009-07-19 20 views
1

Ich entwerfe eine Website. Es ist in einem sehr frühen Stadium, und ich muss eine Entscheidung treffen, ob ich einen SingleSignOn-Dienst verwenden soll, der vom Server bereitgestellt wird. (Es ist eine Campus-Site, und immer mehr Sites verwenden SSO hier, also ist es im Allgemeinen eine gute Idee). Die Zielplattform wird höchstwahrscheinlich über Mod_wsgi Django sein. Jede Dokumentation, die mit diesem Dienst bereitgestellt wird, enthält jedoch PHP-Code. Diese Methode basiert stark auf benutzerdefinierten $_SERVER['HTTPsomething'] Variablen. Leider habe ich im Moment keinen Zugriff auf diese Umgebung.

(Wie) kann ich auf diese benutzerdefinierten Variablen in Django zugreifen? Laut der Dokumentation WSGI sollte die Umgebungsvariable so viele Variablen wie möglich enthalten. Kann ich sicher sein, dass ich auf sie zugreifen kann?

Antwort

5

In Django, die Server-Umgebungsvariablen als Wörterbuch Mitglieder des META Attribut auf dem request Objekt zur Verfügung gestellt - so in der Ansicht, können Sie immer sie request.META['foo'] über Zugriff wo foo der Name der Variablen ist.

Eine einfache Möglichkeit zu sehen, was verfügbar ist, ist eine Sicht zu erstellen, die assert False enthält, um einen Fehler auszulösen. Solange Sie mit DEBUG=True laufen, sehen Sie eine nette Fehlerseite, die viele Informationen über den Serverstatus enthält, einschließlich einer vollständigen Liste aller request Attribute.

0

Nun, $ _SERVER ist PHP. Sie können wahrscheinlich auch über WSGI auf die gleichen Variablen zugreifen, aber Sie müssen genau herausfinden, wie das SSO funktioniert, damit Sie wissen, was diese Variablen erzeugt (wahrscheinlich Apache) und auf welche Sie zugreifen können.

Oder Sie können sich Zugang verschaffen und es ausprobieren. :)

3

Um die Menge der Variablen zu bestimmen, die in der rohen WSGI-Umgebung übergeben werden, bevor Django irgendetwas mit ihnen macht, fügen Sie den folgenden Code in die WSGI-Skriptdatei anstelle Ihres Django-Krams ein.

import StringIO 

def application(environ, start_response): 
    headers = [] 
    headers.append(('Content-type', 'text/plain')) 

    start_response('200 OK', headers) 

    input = environ['wsgi.input'] 
    output = StringIO.StringIO() 

    keys = environ.keys() 
    keys.sort() 
    for key in keys: 
     print >> output, '%s: %s' % (key, repr(environ[key])) 
    print >> output 

    length = int(environ.get('CONTENT_LENGTH', '0')) 
    output.write(input.read(length)) 

    return [output.getvalue()] 

Die Anzahl der Schlüssel/Wert-Paare wird dem Browser angezeigt.

Es ist wichtig herauszufinden, wie der SSO-Mechanismus funktioniert. Wenn es das Sinnvolle tut, werden Sie möglicherweise feststellen, dass es REMOTE_USER und möglicherweise AUTH_TYPE Variablen setzt. Wenn REMOTE_USER festgelegt ist, ist dies ein Indikator dafür, dass der in der Variablen benannte Benutzer von einem höheren Authentifizierungsmechanismus in Apache authentifiziert wurde. Diese Variablen würden normalerweise für die HTTP-Basis- und Digest-Authentifizierung festgelegt, aber um mit so vielen Systemen wie möglich zu arbeiten, sollte ein SSO-Mechanismus diese auch verwenden.

Wenn sie gesetzt sind, dann gibt es eine Django-Funktion, beschrieben unter:

http://docs.djangoproject.com/en/dev/howto/auth-remote-user/

, die dann verwendet werden können, haben Django-Authentifizierung auf einer höheren Ebene getan akzeptieren.

Auch wenn der SSO-Mechanismus nicht REMOTE_USER verwendet, sondern benutzerdefinierte Header verwendet, können Sie einen benutzerdefinierten WSGI-Wrapper für die gesamte Django-Anwendung verwenden, um benutzerdefinierte Header in einen geeigneten REMOTE_USER-Wert zu übersetzen, den Django dann verwenden kann .

+0

Danke, das war sehr informativ. –