2011-09-20 24 views
8

私が書いているdjangoプロジェクトでMongoEngineを使用しようとしています。私は、認証バックエンドがうまく動作する(または理解する方法が)難しいです。MongoEngineユーザー認証(django)

私が知る限り、ユーザーオブジェクトはリクエストに格納されません。

私はそれが働いていますが、私は正しいか安全な方法でそれをやっているか分かりません。誰かが私のコードを見ることができたら、私は大変感謝しています。あなたがいずれかの一切言及していないが、私は私のためにmongoengineを使用しているため

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

SESSION_ENGINE = 'mongoengine.django.sessions' 

import mongoengine 
mongoengine.connect('project') 

答えて

10

ないあなたはすべての問題を見ているかどうかわから:私は、ファイルの先頭に追加している私のsettings.pyで

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

認証バックエンドと、これは私がそれを処理する方法を次のとおりです。

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

あなたはユーザーがリクエストに格納されていない...あなたはそれがテンプレートでは使用できないという意味であれば、あなたは認証テンプレートのコンテキストプロセッサを追加する必要があると言いますあなたにRの設定(あなたの設定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 **から** User **をインポートするのは意味をなさないかもしれません( "普通の"ユーザは** django.contrib.auth.models **からインポートしなければなりません。** django.contribではなく.auth **) –