2011-09-20 103 views
8

我想在我寫的django項目中使用MongoEngine。我很難獲得(或瞭解如何)身份驗證後端的工作原理。MongoEngine用戶身份驗證(django)

盡我所知,用戶對象不存儲在請求中。

我有它的工作,但我不知道我是否以正確/安全的方式做它。如果有人可以看我的代碼,我將不勝感激。

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') 
在我的settings.py

我在文件的頂部添加:

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

SESSION_ENGINE = 'mongoengine.django.sessions' 

import mongoengine 
mongoengine.connect('project') 

回答

10

不知道,如果你看到的任何問題,因爲你沒有提到的任何但我用mongoengine我AUTH後端,這是我將如何處理它:

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

你說用戶沒有存儲在請求...如果你的意思是不是在可用模板,您需要添加AUTH模板背景處理器在你身上右設置(除AUTHENTICATION_BACKENDS設置,您已設置的話):

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

要連接到後續請求登錄後的用戶,設置AuthenticationMiddleware和用戶將是request的所有意見的屬性:

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

感謝您的幫助,我已經準備好了它應該如何工作,一個注意事項是您不應該調用視圖'login',因爲它與實際的登錄函數衝突。 – justinfay

+0

正確,我正在複製你的例子。我寫的是顯示模式 – MattoTodd

+5

感謝您的指針!儘管從** mongoengine.django.auth **(「常規」用戶必須從** django.contrib.auth.models **導入用戶,而不是** django.contrib .auth **) –