时间:2021-05-22
前言
有时候 Django 自带的用户登录认证不能满足我们的需求,比如我不想要用户名+密码登录,我想手机号+验证码登录,这样就需要我们去修改 Django 自带的认证了。
Django 默认使用用户认证的是ModelBackend,这个类也就是我们要下手的地方,ModelBackend里面有一个authenticate的方法,这个方法就是登录时对用户认证的方法。我们要改的就是这个方法。
先看看原码理解一下认证逻辑:
第15-16行先获取认证用的用户名字段,默认是username,如果在Usermodel里面重新定义了USERNAME_FIELD,如改为USERNAME_FIELD = 'mobile',那么现在就是以手机号来登录了。
第18-22行就是根据 username 去获取 user 对象,如果没有这个 user 就做一次密码 hasher (不太理解这里的作用,不过不影响修改),然后就退出方法了。
第24-25行就是获取到用户后,验证用户传过来的密码跟数据库里的是否一致并且该用户是否有登录权限,验证都通过后就把 user 返回去,否则退出返回,不返回任何东西。
明白了认证的逻辑,就开始修改了,首先新建一个类,继承ModelBackend,然后重写authenticate方法,比如上面提到的改为手机号+验证码的方式,只要改成如下:
只是稍微的做了点修改,把第24行里的密码验证改为了验证码验证,这里password 字段用于存放验证码,而不再是用户的密码了。其它的逻辑都没变。
这里改了之后,要在Usermodel 里加上check_verify_code这个方法,否则会报错,还要修改类变量USERNAME_FIELD = 'mobile',不然还是会以username来认证,具体的实现逻辑根据自己的实际情况来,这里就不展示里面的逻辑。
好,用户的认证改好了,还有最重要的一步,在settings.py里添加一条这样的配置:
AUTHENTICATION_BACKENDS = ['common.backends.CustomModelBackends'] # 里面改成自己写的认证类。格式必须是 包名.文件名.类名
到此就完成了。
总结:(以手机号+验证码为例)
AUTHENTICATION_BACKENDS = ['common.backends.CustomModelBackends']
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
前言Django附带的认证对于大多数常见情况来说已经足够了,但是如何在Django中使用自定义的数据表进行用户认证,有一种较为笨蛋的办法就是自定义好数据表后,使
自定义用户认证系统Django自带的用户认证系统已经可以满足大部分的情况,但是有时候我们需要某些特定的需求。Django支持使用其他认证系统、也可以扩展Djan
自定义登录filter上篇文章我们说到,对于用户的登录,security通过定义一个filter拦截login路径来实现的,所以我们要实现自定义登录,需要自己定
照例先看效果图自定义代码示例publicclassBezierViewextendsView{Paintpaint;//画笔Pathpath;//路径intra
这篇文章主要介绍了django自定义模板标签过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下代码布局自