MongoEngine аутентификация пользователя (django) - PullRequest
8 голосов
/ 21 сентября 2011

Я пытаюсь использовать 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')

1 Ответ

10 голосов
/ 21 сентября 2011

Не уверен, если вы видите какие-либо проблемы, потому что вы не упоминаете о них, но я использую mongoengine для моей аутентификации, и вот как я бы справился:

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

Вы говорите, что пользователь не сохранен в запросе ... если вы имеете в виду, что он недоступен в шаблонах, вам нужно добавить обработчик контекста шаблона аутентификации в ваши настройки (в дополнение к настройке AUTHENTICATION_BACKENDS, которую вы уже установили) :

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

Чтобы привязать пользователя к последующим запросам после входа в систему, установите AuthenticationMiddleware, и пользователь будет атрибутом request во всех ваших представлениях:

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