Django request.user 根本不使用自定义后端

问题描述 投票:0回答:1

我正在 Django 5.0 中使用自定义用户模型和自定义后端进行编码,以使用电子邮件登录。 这是后端:

class EmailBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        print("authenticate called")
        try:
            user = User.objects.get(email=username)
        except User.DoesNotExist:
            return None
        else:
            if user.check_password(password):
                return user
        return None

    def get_user(self, user_id):
        try:
            print(user_id)
            print("get_user called")
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

它已在 AUTHENTICATION_BACKENDS 中正确注册,并且用户模型只有一个电子邮件字段。

后端在我的寄存器视图中使用

authenticate(request, username=email, password=password)
完美运行,并且
login(request, user)
也能正常运行。

但是,如果在另一个视图中,登录后我尝试使用

request.user
,它总是会返回
AnonymousUser
。 如果我这样做
request.session.values
,则用户 ID 是正确的。

我在网上找不到有同样问题的人,所以我希望有人能帮我解决问题。

我尝试将 request.user 与自定义后端一起使用,但从未被调用。 我还尝试使用 request.session.values,这次用户 ID 是正确的。 request.user 应该使用我的自定义模型返回当前用户,但它总是返回 AnonymousUser

python django django-models django-views backend
1个回答
0
投票

在幕后,Django 维护一个“身份验证后端”列表,用于检查身份验证。当调用

authenticate()
时,Django 会尝试在其所有身份验证后端进行身份验证。

如果第一个身份验证方法失败,Django 将尝试第二个身份验证方法,依此类推,直到尝试了所有后端。但如果成功了,Django 就不会继续。

这意味着指定“身份验证后端”的顺序很重要。您的自定义“身份验证后端”应添加到

AUTHENTICATION_BACKENDS
[django-docs] 的列表中
settings

AUTHENTICATION_BACKENDS = [
    'python path.to.EmailBackend',
    'django.contrib.auth.backends.ModelBackend'
]
© www.soinside.com 2019 - 2024. All rights reserved.