Frage Kann ich die HTTP-Standardauthentifizierung mit Django verwenden?


Wir haben eine Website, die auf Apache läuft, auf die eine Reihe von statischen Seiten über die HTTP-Standardauthentifizierung zugreifen kann.

Ich habe einen neuen Teil der Seite mit Django geschrieben, mit Djangos eingebauter Unterstützung für die Benutzerverwaltung.

Das Problem, das ich habe, ist, dass Benutzer sich einmal über die HTTP-Standardauthentifizierung und dann wieder über ein Django-Login-Formular anmelden müssen. Dies ist sowohl plump und sehr verwirrend für die Benutzer.

Ich habe mich gefragt, ob irgendjemand einen Weg gefunden hat, Django als Benutzer bei der Verwendung der HTTP-Standard-Authentifizierungsinformationen zu protokollieren.

Ich erwarte nicht, ein Passwort an Django zu übergeben, sondern eher an einen Benutzer dave wurde von Apache authentifiziert, dann sollten sie automatisch bei Django als eingeloggt sein dave auch.

(Eine Option wäre, Apache und Django dazu zu bringen, einen Benutzerspeicher zu teilen, um gemeinsame Benutzernamen und Passwörter sicherzustellen, aber dies würde immer noch zwei Anmeldeaufforderungen beinhalten, was ich zu vermeiden versuche.)


36
2017-09-30 08:34


Ursprung


Antworten:


Dies wurde der Version 1.3 von Django hinzugefügt. Weitere aktuelle Dokumentation finden Sie hier: http://docs.djangoproject.com/de/dev/howto/auth-remote-user/


23
2018-05-04 00:42



Um nur einige grundlegende Anfragen zu beantworten (und nicht mit dem Webserver zu quälen - so könnte jemand Ihren Fragetitel interpretieren), sollten Sie hier nachsehen:

http://www.djangosnippets.org/snippets/243/


32
2017-07-06 15:48



Sieh dir Oli's Links an. Im Grunde sehen Sie den authentifizierten Benutzernamen, wie er von der Basic HTTP Authentication in Django überprüft wird, indem Sie auf request.META ['REMOTE_USER'] schauen.

Aktualisieren: Getestet den vorgeschlagenen Patch für Ticket # 689, die im git-Repository von telenieko aktuell zur Verfügung steht Hier. Es gilt zumindest bei Überarbeitung sauber 9084 von Django.

Aktivieren Sie das Remote-Benutzer-Authentifizierungs-Backend von

  • Hinzufügen der RemoteUserAuthMiddleware nach AuthenticationMiddleware
  • Hinzufügen der Einstellung AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.RemoteUserAuthBackend',)

Wenn Sie wie ich Lighttpd und FastCGI verwenden, aktivieren Sie mod_auth, erstellen Sie Anmeldeinformationen für einen Testbenutzer (ich nannte es testuser und einstellen 123 als Passwort) und konfigurieren Sie die Django-Site so, dass eine Standardauthentifizierung erforderlich ist.

Folgende urls.py kann verwendet werden, um das Setup zu testen:

from django.conf.urls.defaults import *
from django.http import HttpResponse
from django.contrib.auth.models import User
urlpatterns = patterns('',
    url(regex='^$',
        view=lambda request: HttpResponse(repr(request), 'text/plain')),

    url(regex='^user/$',
        view=lambda request: HttpResponse(repr(request.user), 'text/plain')),

    url(regex='^users/$',
        view=lambda request: HttpResponse(
            ','.join(u.username for u in User.objects.all()),
            'text/plain')),
)

Nach dem erneuten Laden von lighty und dem Django FCGI Server fragt das Laden des root der Site nun nach Authentifizierung und akzeptiert die testuser Anmeldeinformationen und gibt dann einen Speicherauszug des Anforderungsobjekts aus. In request.META sollten diese neuen Eigenschaften vorhanden sein:

'AUTH_TYPE': 'Basic'
'HTTP_AUTHORIZATION': 'Basic dGVzdHVzZXI6MTIz'
'REMOTE_USER': 'testuser'

Das /user/ URL kann verwendet werden, um zu überprüfen, dass Sie tatsächlich als angemeldet sind testuser:

<User: testuser>

Und das /users/ URL listet nun die automatisch hinzugefügten auf testuser (Hier das admin Benutzer, den ich beim Erstellen erstellt hatte syncdb wird auch angezeigt):

admin,testuser

Wenn du Django nicht patchen willst, ist es trivial, das zu lösen RemoteUserAuthBackend und RemoteUserAuthMiddleware Klassen in ein separates Modul und beziehen sich darauf in den Django-Einstellungen.


10
2017-10-01 07:36



Es gibt httpauth.py. Ich bin immer noch ein kompletter Neuling mit Django, also habe ich keine Ahnung, wie es genau passt, aber es sollte tun, was du suchst.

Bearbeiten: hier ist ein längerer Bug-Thread zum Thema.


3
2017-09-30 08:39



Da django auf verschiedene Arten ausgeführt werden kann und nur mit modpython eine enge Integration mit Apache möglich ist, glaube ich nicht, dass es für django eine Möglichkeit gibt, Sie auf Basis der Basisberechtigung von Apache einzuloggen. Die Authentifizierung sollte wirklich auf Anwendungsebene erfolgen, da Sie dadurch viel mehr Kontrolle haben und einfacher arbeiten können. Sie wollen wirklich nicht die Mühe haben, eine Userdata zwischen Python und Apache zu teilen.

Wenn es Ihnen nichts ausmacht, eine gepatchte Version von Django zu verwenden, gibt es einen Patch bei http://www.djangosnippets.org/snippets/56/ Das wird Ihnen einige Middleware zur Unterstützung der grundlegenden Authentifizierung geben.

Basic Auth ist wirklich ziemlich einfach - wenn der Benutzer nicht angemeldet ist, geben Sie einen 401 Authentifizierungsstatuscode zurück. Dies fordert den Browser auf, eine Login-Box anzuzeigen. Der Browser liefert dann den Benutzernamen und das Passwort als bas64-codierte Zeichenfolgen. Der Wikipedia-Eintrag http://en.wikipedia.org/wiki/Basic_access_authentication ist ziemlich gut.

Wenn der Patch nicht das tut, was Sie wollen, können Sie Basic Auth relativ schnell implementieren.


0
2017-09-30 20:55



Dies scheint eine Aufgabe für den Kunden zu sein AuthenticationBackend - sehen Django Dokumentation zu diesem Thema, djangosnippets.org hat einige reale Beispiele für solchen Code (siehe 1 oder 2) (und das ist nicht wirklich eine harte Sache).

AuthenticationBackend Unterklassen müssen nur zwei Methoden definiert haben und ihr Code ist ziemlich einfach: man muss Benutzerobjekt für die Benutzer-ID zurückgeben, der zweite muss die Berechtigungsnachweise überprüfen und das Benutzerobjekt zurückgeben, wenn die Berechtigungsnachweise gültig sind.


0
2017-10-01 09:14