Djangoのデフォルトの認証バックエンドは、ユーザーのユーザー名とパスワードが確認されているかどうかを判断することですが、実際には、ユーザー名や携帯電話番号など、より多くのログイン要件がある場合があります。または、メールなどでログインします。現時点では、authenticate()メソッドを書き換えて実現できます。
1.カスタム認証バックエンド
新しいpyファイルを作成し、ModelBackendを継承するクラスを作成し、authenticate()メソッドを書き直します。
from django.contrib.auth.backends import ModelBackend
import re
from .models import User
class UsernameMobileAuthBackend(ModelBackend):
def authenticate(self, request, username=None, password=None, **kwargs):
try:
# 先按用户名查找
user = User.objects.get(
# username=="18588269037" or mobile=="18588269037"
Q(username=username) | Q(mobile=username) | Q(email=username)
)
except User.DoesNotExist as e:
return None
# 如果用户存在再校验密码
if user.check_password(password):
return user
2.構成ファイル
カスタム認証バックエンドを完了した後、構成ファイルでDjangoに、デフォルトの認証バックエンドの代わりにカスタム認証バックエンドを使用するように指示する必要もあります。
AUTHENTICATION_BACKENDS = ['apps.users.utils.UsernameMobileAuthBackend']
他の同様のリンク
[Django]ユーザーを作成し、AbstractUserカスタムユーザーモデルクラスを継承します
[Django]カスタムストレージバックエンドを使用して、全体像のURLリンクを返します