2009-07-07 7 views
12

en primer lugar: esto es no lo mismo que this. The ModelBackend no tiene miembro request.Solicitud de acceso.sesión de backend.get_user

Deseo acceder a la sesión del usuario actual sin acceso al objeto de solicitud global o su ID de sesión.

¿Por qué? Escribí mi propio backend de autenticación, extendiendo ModelBackend. En eso tengo la función get_user (self, user_id), que se llama con cada solicitud (esto lo hace automáticamente el middleware de autenticación de Django). Desafortunadamente, get_user no tiene acceso a request, pero aún así, en mi caso, deseo verificar los datos en la sesión (¿Por qué otra vez? Porque no tengo una base de datos local y obtengo todos los datos de un middleware remoto. ser una forma cómoda de hacer algún tipo de almacenamiento en caché).

Respuesta

4

El RemoteUserBackend (de django.contrib.auth.backends) utiliza un middleware especial, RemoteUserMiddleware, para acceder a los datos de solicitud. Quizás podrías hacerlo de esta manera también.

+0

Lo siento, sé que este es un hilo viejo, pero estoy viendo el código al que se hace referencia y no veo dónde está accediendo a los datos de solicitud para el usuario que acabo de autenticar. – ThatAintWorking

+2

@RonSmith He actualizado un poco los enlaces. El truco es que todo está hecho por 'RemoteUserMiddleware.process_request' - se pasa un objeto' request' (middleware.py # L40). Comprueba la presencia del encabezado HTTP 'Remote-User' (L50) y si es así pasa esos datos a' RemoteUserBackend.authenticate' (L73) y guarda el resultado en 'request' (L77). En este caso, solo el valor del encabezado HTTP es passeb, pero la idea era que si necesita información de sesión en el back-end de autenticación, podría esconderlo preventivamente desde un middleware. – drdaeman

+2

¿Te importa actualizar tu respuesta con algunas líneas de código como ejemplo? Gracias. –

6

Puede usar la pequeña ThreadLocalMiddleware. Hace que el objeto de solicitud esté disponible en todas partes.

from django_tools.middlewares import ThreadLocal 

request = ThreadLocal.get_current_request() 
# request.session <-- is now available 

No se olvide de añadir el middleware en la tupla MIDDLEWARE_CLASSES de su settings.py:

MIDDLEWARE_CLASSES = (
    ... 
    'django_tools.middlewares.ThreadLocal.ThreadLocalMiddleware', 
    ... 
) 
+0

Lamentablemente es GPL V3 ... –

0

También se puede pasar un parámetro de 'solicitud' a la función authenticate en cualquier momento que lo llama:

def authenticate(self, request, **kwargs): 
    .... 
+0

La pregunta es acerca de la función get_user, no authenticate (..) – chaim

+0

Aún encontré la respuesta útil ya que la necesitaba durante la autenticación. – Jayen