zoukankan      html  css  js  c++  java
  • Auth模块

    本文目录

    Auth模块是什么

    Auth模块时Django自带的用户认证模块,可以快速的实现用户注册,登录,认证,注销,修改密码等功能。

    Django内置强大的用户认证系统——auth,它默认使用auth_user表来存储用户数据。

    Auth模块怎么用

    (1)先创建超级用户:   

      -python3 manage.py createsuperuser
      -输入用户名,邮箱(可以不输入),密码,敲回车,这样就创建出一个超级用户
      -也就是在auth_user这个表中插入了一条数据(密码是加密的,所以我不能手动插入)

    (2)验证用户:

      -from django.contrib import auth
      -user = auth.authenticate(request, username=name, password=pwd)
      -相当于在查询:user=models.User.objects.filter(name=name,pwd=pwd).first()
      -如果校验通过,会返回一个user对象,通过判断user对象,校验是否验证成功


    authenticate()

      

      提供了用户认证功能,即验证用户名以及密码是否正确,一般需要username 、password两个关键字参数。

      如果认证成功(用户名和密码正确有效),便会返回一个 User 对象。

      authenticate()会在该 User 对象上设置一个属性来标识后端已经认证了该用户,且该信息在后续的登录过程中是需要的。

    用法:

    user = authenticate(username='usernamer',password='password')


    (3)登录 :  

      -auth.login(request,user)
      -其实就是在session中写了一条数据
    (4)一旦登录成功,调了这个函数login(request,user)

       -以后再视图类,函数中的request对象中,就有一个user对象,就是当前登录的用户对象
      -如果没有登录,request.user=AnonymousUser,匿名用户


    login(HttpRequest,user)

      该函数接受一个HttpRequest对象,以及一个经过认证的User对象。

      该函数实现一个用户登录的功能。它本质上会在后端为该用户生成相关session数据。

    用法:

    from django.contrib.auth import authenticate, login
       
    def my_view(request):
      username = request.POST['username']
      password = request.POST['password']
      user = authenticate(username=username, password=password)
      if user is not None:
        login(request, user)
        # Redirect to a success page.
        ...
      else:
        # Return an 'invalid login' error message.
        ...


    (5)注销

       -auth.logout(request)
      -内部:调用了request.session.flush(),删除了登录状态


    login(request)

      该函数接受一个HttpRequest对象,无返回值。

      当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。

    用法:

    from django.contrib.auth import logout
       
    def logout_view(request):
      logout(request)
      # Redirect to a success page.


    (6)登录认证装饰器   

      -from django.contrib.auth.decorators import login_required
      -@login_required(redirect_field_name='eee',login_url='/login/')
      -redirect_field_name:修改?后面的key值,
      -login_url:如果没有登录,跳转到的页面
        -可以局部配置
        -可以全局配置(在setting中)
          # 全局的配置,如果没有登录,跳到这个路由
          LOGIN_URL='/login/'


    login_required()

    auth 给我们提供的一个装饰器工具,用来快捷的给某个视图添加登录校验。

    用法:

    from django.contrib.auth.decorators import login_required
          
    @login_required
    def my_view(request):
      ...

    若用户没有登录,则会跳转到django默认的 登录URL '/accounts/login/ ' 并传递当前访问url的绝对路径 (登陆成功后,会重定向到该路径)。

    如果需要自定义登录的URL,则需要在settings.py文件中通过LOGIN_URL进行修改。

    示例:

    LOGIN_URL = '/login/'  # 这里配置成你项目登录页面的路由

    (7)创建用户:   

      -from django.contrib.auth.models import User
      - 创建超级用户和普通用户
        # 不能用create
        # user=User.objects.create(username=name,password=pwd)
        # 创建超级用户
        # user=User.objects.create_superuser(username=name,password=pwd)
        # 创建普通用户
        user=User.objects.create_user(username=name,password=pwd)


    create_user()

    auth 提供的一个创建新用户的方法,需要提供必要参数(username、password)等。

    用法:

    from django.contrib.auth.models import User
    user = User.objects.create_user(username='用户名',password='密码',email='邮箱',...)

    create_superuser()

    auth 提供的一个创建新的超级用户的方法,需要提供必要参数(username、password)等。

    用法:

    from django.contrib.auth.models import User
    user = User.objects.create_superuser(username='用户名',password='密码',email='邮箱',...)

    (8)校验密码

       -request.user.check_password(pwd)
      -先拿到用户(可以是登录用户,可以现查)


    check_password(password)

    auth 提供的一个检查密码是否正确的方法,需要提供当前请求用户的密码。

    密码正确返回True,否则返回False。

    用法:

    ok = user.check_password('密码')


    (9)修改密码:

       -user.set_password(pwd)
      -user.save()
      -注意:一定要调用save(),否则是不保存的


    set_password(password)

    auth 提供的一个修改密码的方法,接收 要设置的新密码 作为参数。

    注意:设置完一定要调用用户对象的save方法!!!

    用法

    user.set_password(password='')
    user.save()
    @login_required
    def set_password(request):
        user = request.user
        err_msg = ''
        if request.method == 'POST':
            old_password = request.POST.get('old_password', '')
            new_password = request.POST.get('new_password', '')
            repeat_password = request.POST.get('repeat_password', '')
            # 检查旧密码是否正确
            if user.check_password(old_password):
                if not new_password:
                    err_msg = '新密码不能为空'
                elif new_password != repeat_password:
                    err_msg = '两次密码不一致'
                else:
                    user.set_password(new_password)
                    user.save()
                    return redirect("/login/")
            else:
                err_msg = '原密码输入错误'
        content = {
            'err_msg': err_msg,
        }
        return render(request, 'set_password.html', content)
    
    一个修改密码的简单示例
    一个修改密码的简单示例


    (10)is_authenticated()

       -如果通过验证,是true反之false


      用来判断当前请求是否通过了认证。

    用法:

    def my_view(request):
      if not request.user.is_authenticated():
        return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))


    (11)其他方法(了解):   

      -is_active:禁止登录网站(用户还存在,封号)
      -is_staff:是否对网站有管理权限(能不能登录admin)


    User对象属性:username, password

    is_staff : 用户是否拥有网站的管理权限.

    is_active : 是否允许用户登录, 设置为 False,可以在不删除用户的前提下禁止用户登录。


    -(12)删除用户   

        -orm删除
      如果想在认证组件上加手机号等其他字段:如何处理
        -(1) 定义一个表模型,跟User一对一管理
          class UserDetail(models.Model):
            phone=models.CharField(max_length=32)
            # 一对一跟auth_user表做关联
            # 如果是从外部引入的表模型,是不能加引号的
            # 如果加引号,只是在当前model找
            user=models.OneToOneField(to=User)
        -(2)定义一个表模型,继承(AbstractUser)
          -from django.contrib.auth.models import AbstractUser
          class UserInfo(AbstractUser):
            # username,password...都有
            phone=models.CharField(max_length=32)
            sex=models.BooleanField()
          -在setting中配置:
            AUTH_USER_MODEL ='app01.UserInfo'
          -做数据库迁移,以后就没有auth_user这个表了,以后认证组件用的表就是UserInfo
          -原来auth中的其他操作:
            -authentication
            -login
            -logout
            -set_password
            ....
            ---一样用,完全一样
          -不一样的地方:
            如果之前用到User这个表模型的地方,都换成UserInfo

    扩展默认的auth_user表

    这内置的认证系统这么好用,但是auth_user表字段都是固定的那几个,我在项目中没法拿来直接使用啊!

    比如,我想要加一个存储用户手机号的字段,怎么办?

    聪明的你可能会想到新建另外一张表然后通过一对一和内置的auth_user表关联,这样虽然能满足要求但是有没有更好的实现方式呢?

    答案是当然有了。

    我们可以通过继承内置的 AbstractUser 类,来定义一个自己的Model类。

    这样既能根据项目需求灵活的设计用户表,又能使用Django强大的认证系统了。

    from django.contrib.auth.models import AbstractUser
    class UserInfo(AbstractUser):
        """
        用户信息表
        """
        nid = models.AutoField(primary_key=True)
        phone = models.CharField(max_length=11, null=True, unique=True)
        
        def __str__(self):
            return self.username

    注意:

    按上面的方式扩展了内置的auth_user表之后,一定要在settings.py中告诉Django,我现在使用我新定义的UserInfo表来做用户认证。写法如下:

    # 引用Django自带的User表,继承使用时需要设置
    AUTH_USER_MODEL = "app名.UserInfo"

    再次注意:

    一旦我们指定了新的认证系统所使用的表,我们就需要重新在数据库中创建该表,而不能继续使用原来默认的auth_user表了。

    博客项目需求分析

    1 需求分析
      -首页(显示文章)
      -文章详情
      -点赞,点踩
      -文章评论
      -字评论
      -评论的展示
      -登录功能(图片验证码)
      -注册功能(基于form验证,ajax)
      -个人站点(不同人不同样式,文章过滤)
      -后台管理:
      -文章展示
      -新增文章
      -富文本编辑器
    
    
    
    2 设计程序(框架,数据库设计)
      -UserInfo----用户表
      -blog-----个人站点表
      -Article----文章表
      -commit----评论表
      -upanddown----点赞点踩表
      -category---文章分类表
      -tag---文章标签表
      -表关系
      -userInfo跟blog ---- 一对一
      -article跟blog-----一对多
      -article跟category----(一篇文章只能由一个分类,一个分类下有多篇文章)一对多
      -article跟tag----(一个标签可以对应多篇文章,一篇文章可以有多个标签)多对多
      -commit跟Article---- 一对多
      -upanddown跟Article---- 一对多
      -user跟commit---一对多
      -user跟upanddown---一对多
      -category跟blog----一对多
      -tag跟blog----一对多
    
    3 分任务开发(git)
    4 测试
    5 上线
    博客项目

    作业:

    1 基于auth组件,写登录注册,修改密码,注销(必须完成)
      -登录成功,显示用户名字,和注销
      -没有登录:显示登录注册
      -基于扩展的auth(写一个表模型,继承abstractuser)
    2 表字段,关系分析好,建出来,同步到数据库(mysql)

  • 相关阅读:
    QFramework 使用指南 2020(二):下载与版本介绍
    QFramework 使用指南 2020 (一): 概述
    Unity 游戏框架搭建 2018 (二) 单例的模板与最佳实践
    Unity 游戏框架搭建 2018 (一) 架构、框架与 QFramework 简介
    Unity 游戏框架搭建 2017 (二十三) 重构小工具 Platform
    Unity 游戏框架搭建 2017 (二十二) 简易引用计数器
    Unity 游戏框架搭建 2017 (二十一) 使用对象池时的一些细节
    你确定你会写 Dockerfile 吗?
    小白学 Python 爬虫(8):网页基础
    老司机大型车祸现场
  • 原文地址:https://www.cnblogs.com/sanqiansi/p/10020665.html
Copyright © 2011-2022 走看看