2011-09-20 22 views
8

Próbuję użyć MongoEngine w projekcie django, który piszę. Mam trudności z uzyskaniem (lub zrozumieniem) działania mechanizmu uwierzytelniania.Uwierzytelnianie użytkownika MongoEngine (django)

Obiekt użytkownika, o ile wiem, nie jest przechowywany w żądaniu.

Mam to działa, ale nie jestem pewien, czy robię to w odpowiedni/bezpieczny sposób. Gdyby ktoś mógł spojrzeć na mój kod, byłbym bardzo wdzięczny.

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

w moim settings.py Dodałem na początku pliku:

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

SESSION_ENGINE = 'mongoengine.django.sessions' 

import mongoengine 
mongoengine.connect('project') 

Odpowiedz

10

nie wiem, czy widzisz jakieś problemy, ponieważ nie wspominają o żadnych ale używam mongoengine dla mojego auth backend i to jak bym go obsługiwać:

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

Mówisz, że użytkownik nie jest zapisany we wniosku ... jeśli oznacza to, że nie jest dostępny w szablonach, trzeba dodać procesor kontekstowego szablonu auth w Tobie R ustawienia (oprócz AUTHENTICATION_BACKENDS ustawienie ustawiono już):

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

Aby użytkownika dołączony do kolejnych żądań po zalogowaniu ustaw AuthenticationMiddleware a użytkownik będzie atrybutem request we wszystkich widokach :

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

Dzięki za pomoc Mam to działa dokładnie to, jak powinien teraz, jedna uwaga nie powinieneś wywoływać widoku 'login', ponieważ zderzy się z rzeczywistą funkcją logowania. – justinfay

+0

poprawne, kopiowałem twój przykład. To, co napisałem, miało pokazać wzór – MattoTodd

+5

Dzięki za wskazówkę! Może jednak być sensowne zaimportowanie ** User ** from ** mongoengine.django.auth ** ("zwykły" użytkownik musi zostać zaimportowany z ** django.contrib.auth.models **, nie ** django.contrib .auth **) –

Powiązane problemy