Django⾃带的⽤户认证后端默认是使⽤⽤户名实现⽤户认证的
⽤户认证后端位置:django.contrib.auth.backends.ModelBackend
。
如果想实现⽤户名和⼿机号都可以认证⽤户,就需要⾃定义⽤户认证后端。
一、⾃定义⽤户认证后端步骤
1、在userapp应⽤中新建auth.py⽂件
2、新建类,继承⾃ModelBackend
3、重写认证authenticate()⽅法
4、分别使⽤⽤户名和⼿机号查询⽤户
5、返回查询到的⽤户实例
from django.contrib.auth.backends import ModelBackend
import re
from .models import Users
class MutiAccountLoginAuth(ModelBackend):
def authenticate(self, request, username=None, password=None, **kwargs):
try:
#对用户名参数进行多账户校验
if re.match('^1[35789]\d{9}', username):
user = Users.objects.get(phone=username)
else:
user=Users.objects.get(username=username)
except Users.DoesNotExist:
user=None
#用户名和密码同时匹配校验
if user and user.check_password(password):
return user
二、 配置⾃定义⽤户认证后端
1、Django⾃带认证后端源码
# django.conf.global_setting.py
AUTHENTICATION_BACKENDS = ['django.contrib.auth.backends.ModelBackend']
2、配置⾃定义⽤户认证后端
# setting/dev.py
#指定⾃定义的⽤户认证后端
AUTHENTICATION_BACKENDS = ['userapp.auth.MutiAccountLoginAuth']
知识要点
Django⾃带的⽤户认证系统只会使⽤⽤户名去认证⼀个⽤户。
所以我们为了实现多账号登录,就可以⾃定义认证后端,采⽤其他的唯⼀信息去认证⼀个⽤户。
三、后端代码:
class LoginView(View):
'''用户登录视图'''
def get(self,request):
'''
显示登录首页
:param request:
:return:
'''
return render(request,'userapp/login.html')
def post(self,request):
'''
处理登录请求
:param request:
:return:
'''
#1、接收参数
username=request.POST.get('username','')
password=request.POST.get('password','')
remember=request.POST.get('remember','')
#2、校验参数(非空校验、格式校验)
if not all([username,password,remember]):
return http.HttpResponseForbidden('缺少必传参数')
# 判断用户名是否是5-8个字符
# if not re.match(r'^[a-zA-Z][a-zA-Z0-9_]{4,7}$', username):
# return http.HttpResponseForbidden('请输⼊5-8个字符的⽤户名')
# 判断密码是否是3-8个字符
if not re.match(r'^[0-9a-zA-Z]{3,8}$', password):
return http.HttpResponseForbidden('请输⼊3-8位的密码')
#3、认证登录用户是否正确,django给我们自带了认证
user=authenticate(username=username,password=password)
if user is None:
return render(request,'userapp/login.html',{'login_error':'用户名或者密码错误'})
#4、状态保存
login(request,user)
if remember !='on':
#关闭浏览器失效
request.session.set_expiry(0)
else:
#None标识默认14天有限期
request.session.set_expiry(None)
#5、响应结果
return redirect(reverse('newsapp:index'))
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/74084.html