2008-09-30 24 views
32

Tenemos un sitio web que se ejecuta en Apache, cuyo acceso tiene una cantidad de páginas estáticas protegidas a través de la autenticación HTTP básica.¿Puedo usar Autenticación básica HTTP con Django?

He escrito una parte nueva del sitio con Django utilizando el soporte integrado de Django para la administración de usuarios.

El problema que tengo es que los usuarios tienen que iniciar sesión una vez a través de la autenticación HTTP básica y luego otra vez usando un formulario de inicio de sesión de Django. Esto es torpe y muy confuso para los usuarios.

Me preguntaba si alguien había encontrado la manera de hacer que Django registre a un usuario utilizando la información de autenticación HTTP básica.

No esperaba pasar una contraseña a Django, sino que si un usuario dave ha sido autenticado por Apache, entonces también deberían iniciar sesión automáticamente en Django como dave.

(Una opción sería hacer Apache y Django comparten un almacén de usuarios para garantizar nombres de usuario y contraseñas comunes pero esto aún implica dos indicadores de conexión que es lo que estoy tratando de evitar.)

Respuesta

3

No es httpauth.py . Todavía soy un completo novato con Django, así que no tengo idea de cómo encaja exactamente, pero debería hacer lo que estás buscando.

Editar: aquí está a longer bug thread on the subject.

+0

Gracias por esto. Espero hacer un poco de tiempo para probar esto la próxima semana y si todo va bien, aceptaré tu respuesta. –

0

Debido a que django se puede ejecutar de varias maneras, y solo modpython le brinda una integración cercana con Apache, no creo que haya una manera para que django inicie sesión en básico en la autenticación básica de Apache. La autenticación realmente debe hacerse a nivel de la aplicación, ya que le dará mucho más control y será más simple. Realmente no quieres la molestia de compartir un userdata entre Python y Apache.

Si no te importa usar una versión parcheada de Django, entonces hay un parche en http://www.djangosnippets.org/snippets/56/ que te dará algún middleware para que sea compatible con la autenticación básica.

La autenticación básica es realmente bastante simple: si el usuario no ha iniciado sesión, devuelve un código de estado de autenticación requerido 401. Esto hace que el navegador muestre un cuadro de inicio de sesión. El navegador proporcionará el nombre de usuario y la contraseña como cadenas codificadas bas64. La entrada de la wikipedia http://en.wikipedia.org/wiki/Basic_access_authentication es bastante buena.

Si el parche no hace lo que quiere, entonces podría implementar la auth autofísica usted mismo rápidamente.

9

Eche un vistazo a los enlaces de Oli. Básicamente, verás el nombre de usuario autenticado verificado por Basic HTTP Authentication en Django mirando request.META ['REMOTE_USER'].

Actualización: probado el parche propuesto para la compra de entradas #689, que está disponible hasta al día en el repositorio git de telenieko here. Se aplica limpiamente al menos en la revisión 9084 de Django.

Activar el control remoto motor de autenticación de usuario por

  • añadiendo el RemoteUserAuthMiddleware después AuthenticationMiddleware
  • añadiendo el AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.RemoteUserAuthBackend',) establecer

Si utiliza lighttpd y FastCGI como yo, active mod_auth, crear credenciales para un usuario de prueba (lo llamé testuser y configuré 123 como contraseña) y configuré el sitio de Django para que requiriera autenticación básica.

Los siguientes urls.py se pueden utilizar para probar la configuración:

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

Después de recargar lighty y el servidor de Django FCGI, la carga de la raíz del sitio ahora pide para la autenticación y acepta las testuser credenciales, y luego salidas un volcado del objeto de solicitud. En request.META estas nuevas propiedades deben estar presentes:

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

La URL /user/ se puede utilizar para comprobar que usted está de hecho conectado como testuser:

<User: testuser> 

Y la URL /users/ ahora enumera el añade automáticamente testuser (en este caso el usuario admin que había creado cuando también se muestra haciendo syncdb):

admin,testuser 

Si no desea aplicar un parche a Django, es trivial separar las clases RemoteUserAuthBackend y RemoteUserAuthMiddleware en un módulo separado y referirse a eso en la configuración de Django.

+0

Gracias por esto. Al final, hice lo que sugeriste y coloqué las clases RemoteUserAuthBackend y RemoteUserAuthMiddleware en mi propio módulo al que hice referencia en settings.py y funcionó bien. –

0

Ésta parece ser una tarea de costumbre AuthenticationBackend - ver Django documentation on this subject, djangosnippets.org tiene algunos ejemplos de la vida real de dicho código (ver 1 o 2) (y esto no es realmente una cosa difícil).

AuthenticationBackend subclases deben tener solo 2 métodos definidos y su código es bastante sencillo: uno debe devolver el objeto Usuario para el ID de usuario, el segundo debe verificar las credenciales y devolver el objeto Usuario si las credenciales son válidas.

29

Por tan sólo el apoyo de autenticación básica sobre algunas peticiones (y no ensuciar con el servidor web - que es cómo alguien podría interpretar el título de la pregunta), tendrá que mirar aquí:

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

+1

Exactamente lo que estaba buscando, ¡gracias! –

+0

¡Simple y justo lo que necesitaba! – Daniel

+0

Esto parece ser un enlace muerto. – epalm

Cuestiones relacionadas