Django自定义身份验证后端不起作用

huangapple go评论81阅读模式
英文:

Django Custom Authentication Backend does not work

问题

这是你提供的代码的中文翻译:

authentication.py:

  1. from django.contrib.auth import get_user_model
  2. class CustomAuthBackend:
  3. def authenticate(self, username=None, password=None):
  4. try:
  5. user = get_user_model().objects.get(email=username)
  6. if password:
  7. if user.check_password(password):
  8. return user
  9. return None
  10. except:
  11. return None
  12. def get_user(self, user_id):
  13. try:
  14. user = get_user_model().objects.get(pk=user_id)
  15. return user
  16. except:
  17. return None

forms.py:

  1. class UserLoginForm(forms.Form):
  2. username = forms.CharField(label="手机号码 / 电子邮件")
  3. password = forms.CharField(widget=forms.PasswordInput(), label="密码")

views.py:

  1. class UserLogin(View):
  2. form_class = UserLoginForm
  3. template_name = "accounts/login.html"
  4. def get(self, request):
  5. return render(request, self.template_name, {"form": self.form_class})
  6. def post(self, request):
  7. form = self.form_class(request.POST)
  8. if form.is_valid():
  9. cd = form.cleaned_data
  10. user = authenticate(
  11. request, username=cd["username"], password=cd["password"]
  12. )
  13. if user:
  14. login(request, user)
  15. messages.success(request, "登录成功。", "success")
  16. return redirect("home:home")
  17. else:
  18. messages.error(request, "用户名和/或密码错误。", "danger")
  19. return render(request, self.template_name, {"form": form})
  20. messages.error(request, "登录失败", "danger")
  21. return render(request, self.template_name, {"form": form})

settings.py:

  1. AUTHENTICATION_BACKENDS = [
  2. "django.contrib.auth.backends.ModelBackend",
  3. "accounts.authentication.CustomAuthBackend",
  4. ]

注意:我已经根据您提供的代码进行了翻译,没有包括任何额外的内容。

英文:

I've made a user model with USERNAME_FIELD defined as phone_number. So login form requires phone_number and password. I want users to be able to also login through their emails. So I created an authentication backend class. Users can login with their phone numbers but they canbot do so with their emails and will receive the 'Username and/or password is wrong' message.

authentication.py:

  1. from django.contrib.auth import get_user_model
  2. class CustomAuthBackend:
  3. def authenticate(self, username=None, password=None):
  4. try:
  5. user = get_user_model().objects.get(email=username)
  6. if password:
  7. if user.check_password(password):
  8. return user
  9. return None
  10. except:
  11. return None
  12. def get_user(self, user_id):
  13. try:
  14. user = get_user_model().objects.get(pk=user_id)
  15. return user
  16. except:
  17. return None

forms.py:

  1. class UserLoginForm(forms.Form):
  2. username = forms.CharField(label="Phone Number / Email")
  3. password = forms.CharField(widget=forms.PasswordInput(), label="Password")

views.py:

  1. class UserLogin(View):
  2. form_class = UserLoginForm
  3. template_name = "accounts/login.html"
  4. def get(self, request):
  5. return render(request, self.template_name, {"form": self.form_class})
  6. def post(self, request):
  7. form = self.form_class(request.POST)
  8. if form.is_valid():
  9. cd = form.cleaned_data
  10. user = authenticate(
  11. request, username=cd["username"], password=cd["password"]
  12. )
  13. if user:
  14. login(request, user)
  15. messages.success(request, "Logged in successfully.", "success")
  16. return redirect("home:home")
  17. else:
  18. messages.error(request, "Username and/or password is wrong.", "danger")
  19. return render(request, self.template_name, {"form": form})
  20. messages.error(request, "Login failed", "danger")
  21. return render(request, self.template_name, {"form": form})

settings.py:

  1. AUTHENTICATION_BACKENDS = [
  2. "django.contrib.auth.backends.ModelBackend",
  3. "accounts.authentication.CustomAuthBackend",
  4. ]

答案1

得分: 1

我忘了在authenticate方法的参数中包括requestDjango自定义身份验证后端不起作用
正确版本:

  1. def authenticate(self, request, username=None, password=None):
  2. # ...
英文:

I had forgotten to include request as a parameter in authenticate method. Django自定义身份验证后端不起作用
Correct version:

  1. def authenticate(self, request, username=None, password=None):
  2. # ...

答案2

得分: 0

假设您已经在settings.py文件中的AUTHENTICATION_BACKENDS设置中包含了自定义后端。

您可以进行条件检查,以确定它是电话号码还是电子邮件,使用regex如下:

  1. import re
  2. from django.contrib.auth import get_user_model
  3. class CustomAuthBackend:
  4. def authenticate(self, request, username=None, password=None):
  5. UserModel = get_user_model()
  6. # 检查用户名是电子邮件地址还是电话号码
  7. if re.match(r'^\+?\d{10,14}$', username):
  8. try:
  9. user = UserModel.objects.get(phone_number=username)
  10. if user.check_password(password):
  11. return user
  12. except UserModel.DoesNotExist:
  13. return None
  14. else:
  15. try:
  16. user = UserModel.objects.get(email=username)
  17. if user.check_password(password):
  18. return user
  19. except UserModel.DoesNotExist:
  20. return None
  21. def get_user(self, user_id):
  22. try:
  23. return get_user_model().objects.get(pk=user_id)
  24. except get_user_model().DoesNotExist:
  25. return None

这是给定代码段的翻译部分,不包括代码本身。

英文:

Assuming that you have already included the custom backend in AUTHENTICATION_BACKENDS setting in settings.py file.

You can make a condition check that whether it is a phone no. or email using regex so:

  1. import re
  2. from django.contrib.auth import get_user_model
  3. class CustomAuthBackend:
  4. def authenticate(self, request, username=None, password=None):
  5. UserModel = get_user_model()
  6. # Check whether username is an email address or phone number
  7. if re.match(r'^\+?\d{10,14}$', username):
  8. try:
  9. user = UserModel.objects.get(phone_number=username)
  10. if user.check_password(password):
  11. return user
  12. except UserModel.DoesNotExist:
  13. return None
  14. else:
  15. try:
  16. user = UserModel.objects.get(email=username)
  17. if user.check_password(password):
  18. return user
  19. except UserModel.DoesNotExist:
  20. return None
  21. def get_user(self, user_id):
  22. try:
  23. return get_user_model().objects.get(pk=user_id)
  24. except get_user_model().DoesNotExist:
  25. return None

huangapple
  • 本文由 发表于 2023年2月16日 03:01:58
  • 转载请务必保留本文链接:https://go.coder-hub.com/75464360.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定