gpt4 book ai didi

python - Django 管理员无法使用自定义身份验证后端

转载 作者:行者123 更新时间:2023-11-30 22:56:17 26 4
gpt4 key购买 nike

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

代码来自Official Django docs

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

模型.py
class UserInfo(AbstractBaseUser, PermissionsMixin):
openid = models.CharField(max_length=50, null=False, unique=True)
nickname = models.CharField(max_length=30, null=True)
...

USERNAME_FIELD = 'openid'
REQUIRED_FIELDS = []
...

objects = UserManager()


class AdminAuthBackend(object):
def authenticate(self, openid=None, password=None):
print "custom auth"
login_valid = ('100' == openid)
pwd_valid = ('tobeno.2' == password)
if login_valid and pwd_valid:
try:
user = UserInfo.objects.get(openid=openid)
except UserInfo.DoesNotExist:
user = UserInfo(openid=openid, password='get from .py')
user.is_staff = True
user.is_superuser = True
user.save()
return user
return None

def get_user(self, user_id):
try:
return UserInfo.objects.get(pk=user_id)
except UserInfo.DoesNotExist:
return None

由于我在 AdminAuthBackend.authenticate() 中放置了 print,因此我知道它何时执行。

当我从 shell 调用 authenticate() 时,在管理页面中会调用自定义身份验证方法,但事实并非如此。

感谢任何帮助。

最佳答案

我自己找到了答案。

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

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 来处理登录操作,但它实际上解析固定字段 usernamepassword,这意味着默认管理站点登录表单忽略您自己的 AuthenticationBackends。

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

关于python - Django 管理员无法使用自定义身份验证后端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37070837/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com