Django 自定义用户登陆认证

有时候 Django 自带的用户登陆认证不能知足咱们的需求,好比我不想要用户名+密码登陆,我想手机号+验证码登陆,这样就须要咱们去修改 Django 自带的认证了。数据库

Django 默认使用用户认证的是ModelBackend,这个类也就是咱们要下手的地方,ModelBackend里面有一个authenticate的方法,这个方法就是登陆时对用户认证的方法。咱们要改的就是这个方法。code

先看看原码理解一下认证逻辑:cdn

第15-16行先获取认证用的用户名字段,默认是username,若是在Usermodel里面从新定义了USERNAME_FIELD,如改成USERNAME_FIELD = 'mobile',那么如今就是以手机号来登陆了。对象

第18-22行就是根据 username 去获取 user 对象,若是没有这个 user 就作一次密码 hasher (不太理解这里的做用,不过不影响修改),而后就退出方法了。blog

第24-25行就是获取到用户后,验证用户传过来的密码跟数据库里的是否一致而且该用户是否有登陆权限,验证都经过后就把 user 返回去,不然退出返回,不返回任何东西。继承

明白了认证的逻辑,就开始修改了,首先新建一个类,继承ModelBackend,而后重写authenticate方法,好比上面提到的改成手机号+验证码的方式,只要改为以下:hash

只是稍微的作了点修改,把第24行里的密码验证改成了验证码验证,这里password 字段用于存放验证码,而再也不是用户的密码了。其它的逻辑都没变。it

这里改了以后,要在Usermodel 里加上check_verify_code这个方法,不然会报错,还要修改类变量USERNAME_FIELD = 'mobile',否则仍是会以username来认证,具体的实现逻辑根据本身的实际状况来,这里就不展现里面的逻辑。io

好,用户的认证改好了,还有最重要的一步,在settings.py里添加一条这样的配置:验证码

AUTHENTICATION_BACKENDS = ['common.backends.CustomModelBackends'] # 里面改为本身写的认证类。格式必须是 包名.文件名.类名

到此就完成了。

总结:(以手机号+验证码为例)

  1. 新建一个 CustomModelBackend 类,重写 authenticate 方法,根据本身实际需求写认证逻辑。
  2. Usermodel里添加验证验证码的方法。
  3. Usermodel里改变类变量USERNAME_FIELDmobile
  4. 在在settings.py里添加一条配置:

AUTHENTICATION_BACKENDS = ['common.backends.CustomModelBackends']

相关文章
相关标签/搜索