2011-09-20 43 views
8

Estoy tratando de usar MongoEngine en un proyecto django que estoy escribiendo. Tengo dificultades para obtener (o comprender cómo) el back-end de autenticación funciona.MongoEngine Autenticación de usuario (django)

El objeto de usuario que yo sepa no está almacenado en la solicitud.

Lo tengo funcionando, pero no estoy seguro si lo estoy haciendo de la manera correcta/segura. Si alguien pudiera mirar mi código, sería muy apreciado.

def login(request): 
    user = authenticate(request.POST['username'],request.POST['password']) 
    if user is not None: 
     request.session['user'] = user 
     if user.is_authenticated: 
      return HttpResponse(user) 
    else: 
     return HttpResponse('login failed') 

def new_page(request): 
    try: 
     user = request.session['user'] 
     if user.is_authenticated: 
      return HttpResponse('welcome') 
    except: 
     return HttpResponse('need be logged in') 

en mi settings.py he añadido en la parte superior del archivo:

AUTHENTICATION_BACKENDS = (
    'mongoengine.django.auth.MongoEngineBackend', 
) 

SESSION_ENGINE = 'mongoengine.django.sessions' 

import mongoengine 
mongoengine.connect('project') 

Respuesta

10

No estoy seguro si usted está viendo ningún problema, ya que no hacen mención de cualquier mongoengine pero yo uso para mi backend de autenticación y así es como me gustaría manejarlo:

from django.contrib.auth import login, User 
from mongoengine.queryset import DoesNotExist 

def login_view(request): 
    try: 
     user = User.objects.get(username=request.POST['username']) 
     if user.check_password(request.POST['password']): 
      user.backend = 'mongoengine.django.auth.MongoEngineBackend' 
      login(request, user) 
      request.session.set_expiry(60 * 60 * 1) # 1 hour timeout 
      return HttpResponse(user) 
     else: 
      return HttpResponse('login failed') 
    except DoesNotExist: 
     return HttpResponse('user does not exist') 
    except Exception 
     return HttpResponse('unknown error') 

usted dice que el usuario no se almacena en la solicitud ... si usted quiere decir que no está disponible en las plantillas, es necesario agregar el procesador contexto de la plantilla de autenticación en ti r ajustes (además de la AUTHENTICATION_BACKENDS configuración que ha establecido ya):

TEMPLATE_CONTEXT_PROCESSORS = (
    ... 
    'django.contrib.auth.context_processors.auth', 
    ... 
) 

para que el usuario adjunta a las solicitudes posteriores después de iniciar sesión, establecer el AuthenticationMiddleware y el usuario va a ser un atributo de la request en todos sus puntos de vista :

MIDDLEWARE_CLASSES = (
... 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
... 
) 
+0

Gracias por la ayuda que tengo funcionando exactamente como debe ser ahora, una nota es que no debe llamar a la vista 'login' ya que chocó con la función de inicio de sesión real. – justinfay

+0

correcto, estaba copiando su ejemplo. lo que escribí fue mostrar el patrón – MattoTodd

+5

¡Gracias por el puntero! Sin embargo, podría tener sentido importar ** Usuario ** de ** mongoengine.django.auth ** (el usuario "regular" debe importarse de ** django.contrib.auth.models **, no ** django.contrib .auth **) –