支持用户名与手机号都可做为登陆帐号

后端实现原理:

jwt扩展的登录视图在收到用户名和密码时,调用django的认证系统中提供的authenticate()检查用户名和密码是否正确。因此继承django.contrib.auth.backends.ModelBackend 并重写authenticate()。django

authenticate(self, request, username=None, password=None, **kwargs)方法的参数说明:后端

  • request 本次认证的请求对象
  • username 本次认证提供的用户帐号
  • password 本次认证提供的密码

重写authenticate方法的思路:spa

  1. 根据username参数查找用户User对象,username参数多是用户名,也多是手机号
  2. 若查找到User对象,调用User对象的check_password方法检查密码是否正确

在users/utils.py中编写:code

def get_user_by_account(account): """ 根据账号获取user对象 :param account: 帐号,能够是用户名,也能够是手机号 :return: User对象 或者 None """
    try: if re.match('^1[3-9]\d{9}$', account): # 账号为手机号
            user = User.objects.get(mobile=account) else: # 账号为用户名
            user = User.objects.get(username=account) except User.DoesNotExist: return None else: return user class UsernameMobileAuthBackend(ModelBackend): """ 自定义用户名或手机号认证 """

    def authenticate(self, request, username=None, password=None, **kwargs): user = get_user_by_account(username) if user is not None and user.check_password(password): return user

在配置文件中告知Django使用咱们自定义的认证后端jwt

AUTHENTICATION_BACKENDS = [ 'users.utils.UsernameMobileAuthBackend', ]
相关文章
相关标签/搜索