Django中的登录认证

Django中已经封装好了后端的认证功能authenticate

1:Django REST framework JWT提供了登录签发JWT的视图,可以直接使用
验证用户名和密码,验证成功后,为用户签发JWT,前端将签发的JWT保存下来。

登录流程为:
查询用户数据,将查询到的数据和用户输入的数据对比验证
request.user===>当前登录的用户
仅使用下面的代码即可实现登录和签发token

from rest_framework_jwt.views import obtain_jwt_token

urlpatterns = [
    url(r'^authorizations/$', obtain_jwt_token),
]

但是此视图函数所返回的只有一个token值,当需要获取到其他值,如user.id,username等值时,需要重写jwt_response_payload_handler函数
2:新建一个py文件重写自定义返回值的函数

def jwt_response_payload_handler(token, user=None, request=None):
    """
    自定义jwt认证成功返回数据
    """
    return {
        'token': token,
        'user_id': user.id,
        'username': user.username
    }

然后修改项目的配置文件

JWT_AUTH = {
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
    'JWT_RESPONSE_PAYLOAD_HANDLER': 'users.utils.jwt_response_payload_handler',
}

便可实现登录功能,此时可以返回给客户端token值和id,显示用户名信息

3:实现使用不同的注册信息进行登录,如使用手机号、邮箱 + 密码登录。
主要的逻辑是接收到用户输入的登录信息,使用正则表达式来判断用户是使用的那种注册信息登录的,然后根据注册信息查找到用户对象,返回用户信息,实现多种号码都可登录的功能

查看jwt视图的源代码发现,查询验证的工作是由authenticate()方法完成,这个方法是由django提供的。
修改Django认证系统的认证后端需要继承django.contrib.auth.backends.ModelBackend,并重写authenticate方法。

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

  • request 本次认证的请求对象
  • username 本次认证提供的用户账号
  • password 本次认证提供的密码
    重写authenticate方法,补充它的验证功能,使其不仅仅可以使用用户名登录
from django.contrib.auth.backends import ModelBackend

class MyAuthenticationBackends(ModelBackend):
    """根据username查找 user对象, 在使用user对象的check_password对比密码是否正确"""
    def authenticate(self, request, username=None, password=None, **kwargs):
        if re.match(r'^1[3-9]\d{9}$', username):
            user = User.objects.get(mobile=username)
        else:
            user = User.objects.get(username=username)
        if user.check_password(password):
            return user
        else:
            return None

再在配置文件中告知django我们自定义的认证

AUTHENTICATION_BACKENDS = [
    'users.utils.UsernameMobileAuthBackend',
]

总结思路:
1.定义类
2.重写authenticate方法
3.配置AUTHENTICATION_BACKENDS=[类]

猜你喜欢

转载自blog.csdn.net/Best_fish/article/details/83422201
今日推荐