• python测试开发django-42.auth模块登陆认证


    前言

    在开发一个网站时,经常会用到用户的注册和登陆相关的账号管理功能,auth模块是Django提供的标准权限管理系统,可以提供用户身份认证, 用户组和权限管理。
    像用户注册、用户登录、用户认证、注销、修改密码等功能都不需要我们去开发,这些功能django已经早就设计好了。

    auth模块

    当我们执行makemigrations和migrate数据库迁移的时候,会自动新增一个auth_user表,用户存放用户账号密码等相关信息。
    创建超级管理员用户python manage.py createsuperuser的时候,会在表里面写入管理员的账号、密码、邮箱等相关信息,如下图

    这里我的账号是root,密码是root,很显然存在数据库的密码不是明文的,而是加密后的

    认证authenticate()

    前面注册的root账号是在auth_user表里面,所以需导入对应的User表,这里密码不是明文的,有个专门的方法authenticate判断是否登录成功

    from django.contrib.auth import authenticate

    > python manage.py shell
    >>> from django.contrib.auth.models import User
    >>> from django.contrib.auth import authenticate
    
    # 输入正确账号,密码,user返回root用户对象
    >>> user=authenticate(username='root',password='root')
    >>> user
    <User: root>
    
    # 输入错误的密码,user返回为空
    >>> user=authenticate(username='root',password='xxxx')
    >>> user
    >>>
    

    authenticate认证用户的密码是否有效, 若有效则返回代表该用户的user对象, 若无效则返回None

    注册create_user

    注册用户可以直接使用create_user方法,非常方便,前面说过密码是加密后的,这里使用create_user方法新增用户会自动加密存储到数据库了

    > python manage.py shell
    >>> from django.contrib.auth.models import User
    >>> from django.contrib.auth import authenticate
    
    # 新增用户test.密码test
    >>> user1=User.objects.create_user(username='test',password='test',email='283340479@qq.com')
    >>> user1.save()
    >>>
    

    save保存后,数据库查看auth_user表新增成功

    修改密码set_password

    当我们需要修改密码的时候,可以用set_password方法,该方法不验证用户的身份,直接修改,一般在已经登陆的时候,修改密码使用

    > python manage.py shell
    >>> from django.contrib.auth.models import User
    >>> from django.contrib.auth import authenticate
    >>> user=authenticate(username='test',password='test')
    
    # 设置新密码
    >>> user.set_password('123456')
    >>> user.save()
    
    # 修改成功后使用新密码登陆
    >>> user=authenticate(username='test',password='test')
    >>> user.set_password('123456')
    

    当密码错误的时候,user返回为空,使用user.set_password('123456')会直接抛异常,所以修改密码的时候,一般先判断下

    >>> user=authenticate(username='test',password='test')
    # 密码不对,user为空抛异常
    >>> user.set_password('123456')
    Traceback (most recent call last):
      File "<console>", line 1, in <module>
    AttributeError: 'NoneType' object has no attribute 'set_password'
    
    # 加判断
    >>> user=authenticate(username='test',password='test')
    >>> user
    >>> if user is not None:
    ...         user.set_password('123456')
    ...         user.save()
    ...
    >>>
    
    

    登陆login

    用户登陆功能,有给专门的login函数,它可以在session中添加SESSION_KEY

    from django.contrib.auth import login

    login(request, user)传2个参数,request和user参数,这里不需要传密码,需配合authenticate(username=username, password=password)先校验账号和密码是否成功

    login(request, user)

    登陆之前还有个is_active判断, is_active是判断用户是否可以用,当它为is_active的时候(True),用户可以正常登陆,当is_active为0(False),用户不可用,相当于拉入黑名单

    from django.contrib.auth import login, authenticate
    
    def login_view(request):
        ‘’‘session登陆'''
        user = authenticate(username='test', password='test')
        if user is not None:
            if user.is_active:
                login(request, user)
    

    退出登陆

    logout会清除request中的user信息, 并刷新session

    from django.contrib.auth import logout
    
    def logout_view(request):
        '''退出登陆'''
        logout(request)
    
  • 相关阅读:
    mybatis入门-1
    try-with-resources 在捕获异常之后自动释放资源 try(){}
    mybatis配置logback
    使用原生的jdbc连接数据库进行查询
    java中的反射
    ajax实现搜索自动补全
    java IO-1 File 2019-07-24
    VMware历史版本
    Centos8.3-NIS
    用户管理
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/10624931.html
Copyright © 2020-2023  润新知