문제

우리는 Apache에서 실행되는 웹 사이트를 가지고 있으며, 액세스에는 HTTP 기본 인증을 통해 여러 정적 페이지가 보호됩니다.

Django의 내장 사용자 관리 지원을 사용하여 Django와 함께 사이트의 새로운 부분을 작성했습니다.

내가 가진 문제는 사용자가 HTTP 기본 인증을 통해 한 번 로그인 한 다음 다시 Django 로그인 양식을 사용하여 로그인해야한다는 것입니다. 이것은 사용자에게 서투르고 매우 혼란 스럽습니다.

누군가가 http 기본 인증 정보를 사용하여 Django를 사용자로 만들 수있는 방법을 찾았는지 궁금했습니다.

나는 암호를 django에 전달할 것으로 기대하지 않고 오히려 사용자가 dave Apache에 의해 인증 된 다음 Django에 자동 로그인해야합니다. dave 도.

(한 가지 옵션은 Apache와 Django가 공통 사용자 이름과 암호를 보장하기 위해 사용자 저장소를 공유하는 것입니다. 그러나 여기에는 여전히 피하려는 두 개의 로그인 프롬프트가 포함됩니다.)

도움이 되었습니까?

해결책

이것은 Django 1.3 릴리스에 추가되었습니다. 여기에 대한 최신 문서를 참조하십시오.http://docs.djangoproject.com/en/dev/howto/auth-remote-user/

다른 팁

일부 요청에 대한 기본 인증을 지원하려면 (웹 서버에 푹 빠지지 않고 누군가가 귀하의 질문 제목을 해석 할 수있는 방법) 여기를보고 싶을 것입니다.

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

Oli의 링크를 확인하십시오. 귀하는 기본적으로 request.meta [ 'remote_user']를 보면서 Django의 기본 HTTP 인증으로 확인 된 인증 된 사용자 이름을 볼 수 있습니다.

업데이트: 티켓에 대한 제안 된 패치를 테스트했습니다 #689, Telenieko의 git 저장소에서 최신 정보 여기. 적어도 개정시 깨끗하게 적용됩니다 9084 장고의.

원격 사용자 인증 백엔드를 활성화하십시오

  • 추가 RemoteUserAuthMiddleware ~ 후에 AuthenticationMiddleware
  • 설정 추가 AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.RemoteUserAuthBackend',)

내가하는 것처럼 lighttpd와 fastcgi를 사용하는 경우 mod_auth를 활성화하고 테스트 사용자를위한 자격 증명을 만듭니다 (나는 그것을 불렀습니다. testuser 그리고 설정 123 비밀번호로) 및 기본 인증이 필요한 Django 사이트를 구성하십시오.

다음과 같은 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')),
)

Lighty와 Django FCGI 서버를 다시로드 한 후 사이트의 루트를로드하면 이제 인증을 요구하고 수락합니다. testuser 자격 증명을 한 다음 요청 객체의 덤프를 출력합니다. request.meta에서 이러한 새로운 속성은 다음과 같습니다.

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

그만큼 /user/ URL을 사용하여 실제로 로그인한지 확인할 수 있습니다. testuser:

<User: testuser>

그리고 /users/ URL은 이제 자동 추가 된 것을 나열합니다 testuser (여기 admin 내가 할 때 만든 사용자 syncdb 또한 표시) :

admin,testuser

Django를 패치하고 싶지 않다면 분리하는 것은 사소한 일입니다. RemoteUserAuthBackend 그리고 RemoteUserAuthMiddleware 클래스를 별도의 모듈로하고 Django 설정에서 참조하십시오.

거기 있습니다 httpauth.py. 나는 여전히 Django와 함께 완전한 신생아이므로 정확히 어떻게 맞는지 모르겠지만, 찾고있는 일을해야합니다.

편집 : 여기에 있습니다 주제의 더 긴 버그 스레드.

Django는 여러 가지 방법으로 실행할 수 있고 Modpython 만 Apache와의 긴밀한 통합을 제공하기 때문에 Django가 Apache의 기본 인증에 Basic에 로그인 할 수있는 방법이 없다고 생각합니다. 인증은 훨씬 더 많은 제어를 제공하고 더 간단 할 것이므로 응용 프로그램 수준에서 실제로 수행해야합니다. Python과 Apache 사이에 사용자 데이터를 공유하는 번거 로움을 원하지 않습니다.

패치 버전의 django를 사용하지 않는다면 패치가 있습니다. http://www.djangosnippets.org/snippets/56/ 기본 인증을 지원하기위한 미들웨어를 제공합니다.

기본 인증은 정말 간단합니다. 사용자가 로그인하지 않으면 401 인증 필수 상태 코드를 반환합니다. 이로 인해 브라우저가 로그인 상자를 표시하도록합니다. 그런 다음 브라우저는 BAS64 인코딩 문자열로 사용자 이름과 비밀번호를 제공합니다. Wikipedia 항목 http://en.wikipedia.org/wiki/basic_access_authentication 꽤 좋습니다.

패치가 원하는 것을 수행하지 않으면 기본 인증을 매우 빠르게 구현할 수 있습니다.

이것은 관습을위한 작업 인 것 같습니다 AuthenticationBackend - 보다 이 주제에 대한 Django 문서, djangosnippets.org에는 그러한 코드의 실제 예가 있습니다 ( 1 또는 2) (그리고 이것은 실제로 어려운 것이 아닙니다).

AuthenticationBackend 서브 클래스는 2 개의 메소드가 정의되어야하며 코드는 매우 간단합니다. 하나는 사용자 ID에 대해 사용자 객체를 반환해야하며, 두 번째는 자격 증명을 수행하고 자격 증명이 유효한 경우 사용자 객체를 확인하고 사용자 객체를 반환해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top