MongoEngine 用户认证(django)

8 投票
1 回答
8261 浏览
提问于 2025-04-17 02:43

我正在一个Django项目中尝试使用MongoEngine。对于身份验证后端的工作原理,我有点困惑,不太明白怎么用。

根据我的观察,用户对象似乎并没有存储在请求中。

我已经让它工作了,但不确定我这样做是否正确或安全。如果有人能帮我看看我的代码,我会非常感激。

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

我不太确定你有没有遇到什么问题,因为你没有提到任何具体的情况。不过我用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',
...
)

撰写回答