Pregunta

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 nueva parte 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 nuevamente utilizando 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 registre a un usuario utilizando la información de autenticación HTTP básica.

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

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

¿Fue útil?

Solución

Esto se ha agregado a la versión Django 1.3. Ver más documentación actual para esto aquí: http://docs.djangoproject.com/en/dev/howto/ auth-remote-user /

Otros consejos

Para solo admitir la autenticación básica en algunas solicitudes (y no jugar con el 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/

Revisa los enlaces de Oli. Básicamente, usted ve el nombre de usuario autenticado como lo verifica la autenticación HTTP básica en Django al consultar request.META ['REMOTE_USER'].

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

Activar el backend de autenticación de usuario remoto mediante

  • agregar el 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é testuser y establezca 123 como contraseña) y configure El sitio de Django requiere una 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='^

Después de volver a cargar lighty y el servidor Django FCGI, cargar la raíz del sitio ahora solicita autenticación y acepta las credenciales testuser , y luego genera 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 usar para verificar que efectivamente hayas iniciado sesión como testuser :

<User: testuser>

Y la URL / users / ahora muestra el testuser agregado automáticamente (aquí el usuario admin que creé al hacer syncdb también se muestra):

admin,testuser

Si no quieres parchear a Django, es trivial separar las clases RemoteUserAuthBackend y RemoteUserAuthMiddleware en un módulo separado y consultarlo en la configuración de Django. / p>, view=lambda request: HttpResponse(repr(request), 'text/plain')), url(regex='^user/

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

<*>

La URL / user / se puede usar para verificar que efectivamente hayas iniciado sesión como testuser :

<*>

Y la URL / users / ahora muestra el testuser agregado automáticamente (aquí el usuario admin que creé al hacer syncdb también se muestra):

<*>

Si no quieres parchear a Django, es trivial separar las clases RemoteUserAuthBackend y RemoteUserAuthMiddleware en un módulo separado y consultarlo en la configuración de Django. / p>, view=lambda request: HttpResponse(repr(request.user), 'text/plain')), url(regex='^users/

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

<*>

La URL / user / se puede usar para verificar que efectivamente hayas iniciado sesión como testuser :

<*>

Y la URL / users / ahora muestra el testuser agregado automáticamente (aquí el usuario admin que creé al hacer syncdb también se muestra):

<*>

Si no quieres parchear a Django, es trivial separar las clases RemoteUserAuthBackend y RemoteUserAuthMiddleware en un módulo separado y consultarlo en la configuración de Django. / p>, 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, cargar la raíz del sitio ahora solicita autenticación y acepta las credenciales testuser , y luego genera un volcado del objeto de solicitud. En request.META estas nuevas propiedades deben estar presentes:

<*>

La URL / user / se puede usar para verificar que efectivamente hayas iniciado sesión como testuser :

<*>

Y la URL / users / ahora muestra el testuser agregado automáticamente (aquí el usuario admin que creé al hacer syncdb también se muestra):

<*>

Si no quieres parchear a Django, es trivial separar las clases RemoteUserAuthBackend y RemoteUserAuthMiddleware en un módulo separado y consultarlo en la configuración de Django. / p>

Hay httpauth.py . Sigo siendo un completo nuevo con Django, así que no tengo idea de cómo encaja exactamente, pero debería hacer lo que estás buscando.

Editar: aquí hay un hilo de errores más largo sobre el tema .

Debido a que django se puede ejecutar de varias maneras, y solo modpython le brinda una estrecha integración con Apache, no creo que haya una manera de que django inicie sesión en modo básico en la autenticación básica de Apache. La autenticación debe realizarse realmente en el 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 datos de usuario 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 le proporcionará cierto middleware para admitir la autenticación básica.

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

Si el parche no hace lo que desea, puede implementar la autenticación básica usted mismo muy rápidamente.

Esto parece ser una tarea para AuthenticationBackend personalizado - consulte documentación de Django sobre este tema , djangosnippets.org tiene algunos ejemplos reales de dicho código (consulte 1 o 2 ) (y esto no es realmente una cosa difícil).

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top