framework contrib backends authenticate auth django http-authentication

contrib - django rest framework authentication



¿Puedo usar Autenticación básica HTTP con Django? (6)

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 forma de que django inicie sesión 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, 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 está conectado, devuelve un código de estado de autenticación 401 requerido. 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 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 autenticación básica usted mismo rápidamente.

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.

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 de nuevo con 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 una manera de hacer que Django ingrese a un usuario usando la información de autenticación HTTP básica.

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

(Una opción sería hacer que Apache y Django compartan una tienda de usuario para asegurar nombres de usuario y contraseñas comunes, pero esto todavía implicaría dos indicaciones de inicio de sesión, que es lo que estoy tratando de evitar).



Esta parece ser una tarea para AuthenticationBackend personalizada: consulte la documentación de Django sobre este tema , djangosnippets.org tiene algunos ejemplos de este código en la vida real (vea 1 o 2 ) (y esto no es realmente algo difícil).

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


Revisa 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: Probó el parche propuesto para el ticket n.º 689 , que está disponible en el repositorio git de telenieko aquí . Se aplica limpiamente al menos en la revisión 9084 de Django.

Activar el backend de autenticación de usuario remoto

  • agregando RemoteUserAuthMiddleware después de AuthenticationMiddleware
  • agregando la configuración AUTHENTICATION_BACKENDS = (''django.contrib.auth.backends.RemoteUserAuthBackend'',)

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

El siguiente urls.py se puede usar 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 volver a cargar Lighty y el servidor Django FCGI, al cargar la raíz del sitio ahora se solicita la autenticación y se aceptan las credenciales del testuser , y luego se genera un volcado del objeto de solicitud. En request.META estas nuevas propiedades deberían estar presentes:

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

El /user/ URL se puede usar para verificar que esté realmente conectado como /user/ testuser :

<User: testuser>

Y el /users/ URL ahora enumera el usuario de testuser agregado automáticamente (aquí también se muestra el usuario admin que había creado al hacer syncdb ):

admin,testuser

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


Solo por respaldar la autenticación básica en algunas solicitudes (y no por el uso del servidor web, que es la forma en que alguien podría interpretar el título de su pregunta), querrá consultar aquí:

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