gpt4 book ai didi

django - 寻找在 Django 中设置自定义身份验证后端的综合指南,或指针

转载 作者:行者123 更新时间:2023-12-02 13:20:36 31 4
gpt4 key购买 nike

我正在尝试设置一个查询另一个数据库的自定义后端,我已在系统中为其创建了一个模型。它使用自己的规则(电子邮件而不是用户名,以及不同的加盐/散列密码),因此我无法使用内置身份验证。我已经设置了一个自定义身份验证后端,如下所示:

class BlahBlahBackend:

def check_password():
# check password code here
return true

def authenticate(self, email=None, password=None):
import myapp.models.loginmodel
try:
person = myapp.models.loginmodel.People.objects.get(email=email)
if check_password(password, person.password):
try:
user = User.objects.get(email=email)
except User.DoesNotExist:
username=person.first_name + person.last_name
name_count = User.objects.filter(username__startswith = username).count()
if name_count:
username = '%s%s'%(username, name_count + 1)
user = User.objects.create_user(username,email)
else:
user = User.objects.create_user(username,email)
except People.DoesNotExist:
return None

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

我已添加 BlahBlahBackend 作为身份验证后端:

AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.ModelBackend', 'socialauth.auth_backends.OpenIdBackend', 'socialauth.auth_backends.TwitterBackend', 'socialauth.auth_backends.FacebookBackend', 'socialauth.auth_backends.BlahBlahBackend', )

正如您所看到的,我还使用了一些也在socialauth中的预先存在的身份验证后端。

我有一个提交表单,指向以下 View :

def blahblah_login_complete(request):
email = request.POST.get('email')
password = request.POST.get('password')
user = authenticate(email,password)
# if user is authenticated then login user
if user:
login(request, user)
else:
return HttpResponseRedirect(reverse('socialauth_login_page'))

但是,当我尝试以这种方式登录时,似乎一个或多个其他后端的行为就好像我正在尝试使用他们的方法登录一样。

我读到后端已缓存,因此运行

Session.objects.all().delete()

清除后端缓存。

我的主要问题是:

  1. AUTHENTICATION_BACKENDS 中列出的项目的顺序是否正确
  2. 系统如何决定/知道使用哪个后端?任何文档都没有明确说明这一点,我觉得这有点令人困惑。
  3. 是否有任何方法可以根据请求强制使用特定授权。换句话说,如果有人提交表单,是否有办法强制他们使用基于表单登录的身份验证,而不是通过 openid 或 Twitter 登录?

更新:

它有效!这非常酷,谢谢。我想 django 文档似乎是在说“你不必做任何其他事情,它就像魔术一样起作用”,事实证明情况确实如此。只要后端存在并且凭据设置正确,身份验证就会起作用。事实证明,真正的问题是 urls.py 文件中的错误配置,该文件没有将登录表单中的帖子发送到正确的处理程序,这就是它不断尝试使用其他身份验证方法的原因。

最佳答案

您应该对 django.contrib.auth.authenticate() 使用关键字参数,名称应与后端验证方法中的参数名称匹配。默认后端处理名称“用户名”和“密码”。

您的后端可以为关键字参数使用不同的名称,例如:blahblah_email 和 blahblah_password,然后调用authenticate(blahblah_email=..., blahblah_password=...)。

关于django - 寻找在 Django 中设置自定义身份验证后端的综合指南,或指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2153223/

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