4

我正在使用带有 Django 的自定义身份验证后端,以从旧系统自动创建和登录用户。我的Backend课是这样的:

from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User
from sfi.models import Employee
import base64, hashlib

class SFIUserBackend(ModelBackend):
    def authenticate(self, username=None, password=None):
        if not username or not password:
            return

        digest = base64.standard_b64encode(hashlib.md5(password).digest())
        user = None
        try:
            employee = Employee.objects.get(login=username, passwd=digest)
            user, created = User.objects.get_or_create(username=username)
            if created:
                # setting attributes
                user.first_name = employee.names[:30]
                user.last_name = employee.surnames[:30]
                user.is_staff = True
                user.save()
        except Employee.DoesNotExist:
            pass

        return user

到目前为止,它工作正常。但是,我需要在模板中读取当前登录用户的后端类。

Usingrequest.user.backend表示user没有属性后端......我无法从会话中读取它(使用request.session._auth_user_backend),因为 Django 模板系统抱怨“变量和属性可能不以下划线开头”。

我正在使用django.contrib.auth.views.login允许用户登录。我错过了什么?

4

3 回答 3

2

当用户使用该 函数进行身份验证时,该backend属性将添加到对象中。userdjango.contrib.auth.authenticate(username='foo',password='bar')

此函数依次调用AUTHENTICATION_BACKENDS您在settings.py文件中指定的所有内容,直到它能够使用其中之一成功进行身份验证。

如果您的用户已“登录”但没有backend可能意味着您没有正确验证他们的属性。也许您在SFIUserBackend.authenticate应该调用函数时直接调用django.contrib.auth.authenticate函数?

查看这些自定义身份验证文档

于 2011-05-03T22:21:08.980 回答
0

您应该在视图中阅读它并发送该类名称的适当人类形式作为消息。

于 2011-02-17T05:57:52.407 回答
0

虽然authenticate()添加user.backend属性并将login()其保存在会话中,但由于某种原因get_user()不会将其添加回用户。我已经提交了一个补丁

因此,为了在另一个请求中访问它,您需要request.session[django.contrib.auth.BACKEND_SESSION_KEY].

您还可以编写自定义标签或将其添加到您的上下文中(以您想要的任何名称)以方便使用。

于 2018-05-09T13:15:59.343 回答