Frage

Wir haben eine Website, auf Apache läuft, zu denen der Zugang eine Reihe von statischen Seiten hat über HTTP-Basic-Authentifizierung geschützt.

Ich habe ein neues Teil der Website geschrieben mit Django Django gebaut der Unterstützung für die Benutzerverwaltung.

Das Problem, das ich habe, ist, dass die Benutzer einmal über die HTTP-Basic-Authentifizierung anmelden und dann wieder ein Django-Anmeldeformular. Diese beide ungeschickt und sehr verwirrend für den Anwender.

Ich habe mich gefragt, ob jemand einen Weg zu machen Django melden Sie sich einen Benutzer bei der Verwendung der HTTP-Basic-Authentifizierung Informationen gefunden hatte.

Ich erwarte kein Passwort Django passieren, sondern wenn ein Benutzer dave wird von Apache authentifiziert wurde, dann sollten sie automatisch in Django auch als dave angemeldet sein.

(Eine Möglichkeit wäre, Apache und Django, um einen Benutzerspeicher teilen gemeinsame Benutzernamen und Passwörter, um sicherzustellen, aber dies würde noch zwei Anmeldungsaufforderungen beinhalten das ist, was ich versuche zu vermeiden.)

War es hilfreich?

Lösung

Dies wurde auf die Django 1.3-Version hinzugefügt. Sehen Sie mehr aktuelle Dokumentation für diese hier: http://docs.djangoproject.com/en/dev/howto/ auth-Remote-Benutzer /

Andere Tipps

Für nur unterstützt grundlegende auth auf einigen Anfragen (und nicht mit dem Web-Server Ausmisten - das ist, wie jemand Ihre Frage Titel interpretieren könnte), werden Sie hier aussehen:

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

Sie Besuche Oli Links. Sie sehen im Grunde die authentifizierte Benutzernamen von Basic HTTP-Authentifizierung in Django überprüft, wie bei request.META suchen [ ‚REMOTE_USER‘].

Update: Getestet die vorgeschlagene Patch für Ticket # 689 , das ist up-to-date in telenieko git-Repository verfügbar hier . Es gilt sauber zumindest auf Revision 9084 von Django.

Aktivieren Sie den Remote-Benutzer-Authentifizierungs-Backend von

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

Wenn Sie lighttpd und FastCGI verwenden, wie ich, aktivieren mod_auth, erstellen Sie Anmeldeinformationen für einen Testbenutzer (Ich nannte es testuser und setzen 123 als Passwort) und konfigurieren Sie die Django-Website Basic-Authentifizierung erforderlich ist.

Das 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 lighty Nachladen und die Django FCGI Server, die Wurzel der Site fragt nun das Laden für die Authentifizierung und akzeptiert die testuser Berechtigungsnachweise, und gibt dann ein Abbild des Anforderungsobjekts. In request.META sollten diese neuen Eigenschaften vorhanden sein:

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

Die /user/ URL verwendet werden kann, um zu überprüfen, dass Sie in der Tat als testuser angemeldet:

<User: testuser>

Und die /users/ URL listet nun die automatisch hinzugefügt testuser (hier der admin Benutzer ich geschaffen hatte, als syncdb tun auch gezeigt wird):

admin,testuser

Wenn Sie Django nicht flicken wollen, ist es trivial die RemoteUserAuthBackend und RemoteUserAuthMiddleware Klassen in ein separates Modul zu lösen und auf die in den Django-Einstellungen beziehen.

Es gibt httpauth.py . Ich bin immer noch ein komplettes Newb mit Django so ich habe keine Ahnung, wie sie paßt in genau, aber es sollte das tun, was Sie suchen.

Edit:. Hier ein längerer Bug-Thread zum Thema

Da django kann auf verschiedene Weise ausgeführt werden, und nur Mod_python gibt Ihnen eine enge Integration mit Apache, ich glaube nicht, gibt es eine Möglichkeit für django Sie auf Apache-Basis-Auth in Grundloggt sein. Authentifizierung soll wirklich auf der Anwendungsebene durchgeführt werden, wie es Ihnen viel mehr Kontrolle geben wird und wird einfacher sein. Sie wirklich wollen nicht die Mühe ein Benutzerdatum zwischen Python und Apache geben.

Wenn Sie nichts dagegen haben eine gepatchte Version von Django dann gibt es einen Patch an http: //www.djangosnippets.org/snippets/56/ die wird Ihnen einige Middleware-Basis Authentifizierung zu unterstützen.

Basis-Auth ist eigentlich ganz einfach - wenn der Benutzer nicht angemeldet ist, in Ihnen einen 401-Authentifizierung erforderlich Statuscode zurück. Dies veranlasst den Browser ein Login-Feld angezeigt werden soll. Der Browser wird dann liefern Sie den Benutzernamen und das Passwort als bas64 kodierten Strings. Der Wikipedia-Eintrag http://en.wikipedia.org/wiki/Basic_access_authentication ist ziemlich gut.

Wenn der Patch nicht tut, was Sie wollen, dann können Sie ganz schnell Auth selbst grundlegende implementieren.

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

AuthenticationBackend Subklassen nur zwei Methoden definiert haben müssen und ihr Code ist ziemlich einfach:. Hat man Benutzerobjekt für Benutzer-ID zurückzukehren, hat die zweite Anmeldeinformationen ausführen überprüfen und Benutzerobjekt zurück, wenn die Anmeldeinformationen gültig sind

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top