Django admin不使用自定义身份验证后端

2024-10-03 06:28:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个自定义的用户模型和一个身份验证后端。 当我使用shell时,身份验证功能可以正常工作,但是当涉及到管理站点登录时,它就是不工作。在

代码来自Official Django docs

在设置.py在

# Authentication
AUTH_USER_MODEL = 'BBUser.UserInfo'
AUTHENTICATION_BACKENDS = [
    'BBUser.models.AuthBackend',
    'BBUser.models.AdminAuthBackend',
]

在模型.py在

^{pr2}$

就像我在AdminAuthBackend.authenticate(),所以我知道什么时候执行。在

当我从shell调用authenticate()时,在管理页面中调用自定义身份验证方法,而在管理页面中则不是。在

感谢任何帮助。在


Tags: django代码用户py模型功能身份验证站点
2条回答

在使用带有电子邮件身份验证的自定义模型时,我遇到了完全相同的问题。我通过创建一个新的后端类来解决这个问题。 据我所知,django正在应用程序中定义的所有后端上循环,检查是否有确切的导入参数。在

在你的情况下,也许这样的方法会管用

class EmailAdminBackend(ModelBackend):
def authenticate(self, request, username=None, password=None):
    UserModel = get_user_model()
    try:
        # Check if the user exists in Django's database
        user = UserModel.objects.get(openid=username)
    except :
        return None
    if user.check_password(password):
        return user
    return None

我自己找到了答案。在

在深入研究Django的源代码之后,我在django.contrib.auth.forms中找到了一个片段,它处理来自管理站点登录表单的post请求:

def clean(self):
    username = self.cleaned_data.get('username')
    password = self.cleaned_data.get('password')

    if username and password:
        self.user_cache = authenticate(username=username,
                                       password=password)
        if self.user_cache is None:
            raise forms.ValidationError(
                self.error_messages['invalid_login'],
                code='invalid_login',
                params={'username': self.username_field.verbose_name},
            )
        else:
            self.confirm_login_allowed(self.user_cache)

    return self.cleaned_data

请注意,尽管它使用auth.authentication来处理登录操作,但它实际上解析固定字段username和{},这意味着默认的管理站点登录表单忽略了您自己的身份验证后端。在

为了解决这个问题,我需要实现我自己的管理网站登录表单。在

相关问题 更多 >