【django】用户登录之多账户登录【20】

导读:本篇文章讲解 【django】用户登录之多账户登录【20】,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

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

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!