2011-09-20 20 views
8

Sto provando a utilizzare MongoEngine in un progetto di django che sto scrivendo. Sto avendo difficoltà a capire (o capire come) il backend di autenticazione funziona.MongoEngine Autenticazione utente (django)

L'oggetto utente per quanto posso dire non è memorizzato nella richiesta.

Ho funzionato ma non sono sicuro se lo sto facendo nel modo giusto/sicuro. Se qualcuno potesse guardare il mio codice sarei molto apprezzato.

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

nel mio settings.py ho aggiunto nella parte superiore del file:

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

SESSION_ENGINE = 'mongoengine.django.sessions' 

import mongoengine 
mongoengine.connect('project') 

risposta

10

Non sono sicuro se si sta vedendo tutti i problemi, perché si fanno alcuna menzione di qualsiasi ma io uso per il mio mongoengine auth backend e questo è come vorrei gestirlo:

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

Tu dici che l'utente non è memorizzato nella richiesta ... se vuoi dire che non è disponibile nei modelli, è necessario aggiungere il processore contesto modello di autenticazione in te r impostazioni (in aggiunta al AUTHENTICATION_BACKENDS impostazione è stata impostata già):

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

di rendere l'utente collegato a richieste successive dopo il login, impostare il AuthenticationMiddleware e l'utente sarà un attributo del request in tutte le vostre opinioni :

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

Grazie per l'aiuto ho fatto esattamente come dovrebbe ora, una nota è che non si dovrebbe chiamare la vista 'login' in quanto si è scontrata con la funzione di accesso effettivo. – justinfay

+0

corretto, stavo copiando il tuo esempio. quello che ho scritto è stato mostrare il pattern – MattoTodd

+5

Grazie per il puntatore! Potrebbe avere senso però importare ** Utente ** da ** mongoengine.django.auth ** (l'utente "normale" deve essere importato da ** django.contrib.auth.models **, non ** django.contrib .auth **) –