Czy Mogę używać podstawowego uwierzytelniania HTTP z Django?

Mamy stronę internetową działającą na Apache, do której dostęp ma wiele statycznych stron chronionych za pomocą podstawowego uwierzytelniania HTTP.

Napisałem nową część strony z Django używając Django wbudowanego w obsługę zarządzania użytkownikami.

Mój problem polega na tym, że użytkownicy muszą zalogować się raz przez podstawowe uwierzytelnianie HTTP, a następnie ponownie za pomocą formularza logowania Django. To zarówno niezdarne, jak i bardzo mylące dla użytkowników.

Zastanawiałem się, czy ktoś znalazł sposób, aby Django loguje użytkownika używając podstawowych informacji uwierzytelniających HTTP.

Nie spodziewam się przekazać hasła do Django, ale raczej jeśli użytkownik dave został uwierzytelniony przez Apache, powinien być automatycznie zalogowany do Django jako dave.

(jedną z opcji byłoby uczynienie Apache i Django wspólnym sklepem użytkowników, aby zapewnić wspólne nazwy użytkowników i hasła, ale nadal wymagałoby to dwóch monitów logowania, czego staram się uniknąć.)

Author: system PAUSE, 2008-09-30

6 answers

To zostało dodane do wydania Django 1.3. Zobacz więcej aktualnej dokumentacji dla tego tutaj: http://docs.djangoproject.com/en/dev/howto/auth-remote-user/

 24
Author: Traveler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-04 00:42:10

Za wspieranie basic auth w niektórych żądaniach (i nie mieszanie się z serwerem WWW-czyli jak ktoś może zinterpretować tytuł twojego pytania), zajrzyj tutaj:

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

 33
Author: wsorenson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-06 15:48:56

[[19]}sprawdź linki Oli. Zasadniczo widzisz uwierzytelnioną nazwę użytkownika jako zweryfikowaną przez podstawowe uwierzytelnianie HTTP w Django patrząc na żądanie.META['REMOTE_USER'].

Aktualizacja: przetestowano proponowaną łatkę dla ticket #689, który jest dostępny na bieżąco w repozytorium Git telenieko tutaj . Stosuje się czysto przynajmniej przy rewizji 9084 Django.

Aktywuj backend zdalnego uwierzytelniania użytkownika przez

  • dodawanie RemoteUserAuthMiddleware Po AuthenticationMiddleware
  • dodawanie Ustawienia AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.RemoteUserAuthBackend',)

Jeśli używasz lighttpd i FastCGI tak jak ja, Aktywuj mod_auth, Utwórz poświadczenia dla testowego użytkownika (nazwałem go testuser i ustawiłem 123 jako hasło) i skonfiguruj stronę Django tak, aby wymagała podstawowego uwierzytelniania.

Do przetestowania konfiguracji można użyć następującej opcji urls.py:

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')),
)

Po przeładowaniu lighty i serwera Django FCGI, załadowanie katalogu głównego strony prosi teraz o uwierzytelnienie i akceptuje testuser poświadczeń, a następnie wypisuje zrzut obiektu request. Na życzenie.META te nowe właściwości powinny być obecne:

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

Adres URL /user/ może być użyty do sprawdzenia, czy rzeczywiście jesteś zalogowany jako testuser:

<User: testuser>

I /users/ URL wyświetla teraz automatycznie dodawany testuser (tutaj pokazany jest również użytkownik admin, którego utworzyłem podczas wykonywania syncdb):

admin,testuser

Jeśli nie chcesz łatać Django, trywialne jest odłączenie klas RemoteUserAuthBackend i RemoteUserAuthMiddleware do osobnego modułu i zobacz to w Ustawieniach Django.

 10
Author: akaihola,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-01 11:56:06

Jest httpauth.py . nadal jestem kompletnym newb z Django, więc nie mam pojęcia, jak to dokładnie pasuje, ale powinno robić to, czego szukasz.

Edit: oto dłuższy wątek błędu w temacie.

 3
Author: Oli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-30 08:39:35

Ponieważ django można uruchomić na kilka sposobów, a tylko modpython daje Ci ścisłą integrację z Apache, nie wierzę, że istnieje sposób, aby django zalogowało cię w basic Na Apache ' s basic auth. Uwierzytelnianie powinno być wykonywane na poziomie aplikacji, ponieważ zapewni Ci to znacznie większą kontrolę i będzie prostsze. Naprawdę nie chcesz kłopotów z udostępnianiem danych użytkownika między Pythonem a Apache.

Jeśli nie masz nic przeciwko użyciu łatanej wersji Django, to jest łatka na http://www.djangosnippets.org/snippets/56 / który da ci trochę oprogramowania pośredniczącego do obsługi basic auth.

Basic auth jest naprawdę dość prosty - jeśli użytkownik nie jest zalogowany, zwracasz wymagany kod statusu uwierzytelniania 401. Monituje to przeglądarkę o wyświetlenie pola logowania. Następnie przeglądarka poda nazwę użytkownika i hasło jako zakodowane ciągi bas64. Wpis w Wikipedii http://en.wikipedia.org/wiki/Basic_access_authentication całkiem nieźle.

Jeśli plaster nie robi tego, co chcesz, wtedy możesz dość szybko zaimplementować podstawowy auth.

 0
Author: Andrew Wilkinson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-30 20:55:26

To wydaje się być zadaniem dla custom AuthenticationBackend - Zobacz Dokumentacja Django na ten temat, djangosnippets.org ma kilka rzeczywistych przykładów takiego kodu (patrz 1 lub 2) (i to wcale nie jest trudne).

AuthenticationBackend podklasy muszą mieć zdefiniowane tylko 2 metody, a ich kod jest dość prosty: jedna musi zwrócić obiekt User dla identyfikatora użytkownika, druga musi wykonać sprawdzenie poświadczeń i zwrócić obiekt User, jeśli poświadczenia są ważne.

 0
Author: zgoda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-01 09:14:56