• django-auth组件


    auth组件

    一、auth模块简介

    auth模块是django自带的用户认证模块,包含了身份验证权限管理两部分。

    身份验证用于核实某个用户是否合法,权限管理用于决定一个合法用户有哪些权限

    默认情况下,使用django-admin startproject命令后,认证模块已经添加到settings文件中,如果没有请手动添加

    INSTALLED_APPS中添加
    `django.contrib.auth`  包含认证框架的核心以及默认模型
    `django.contrib.contenttypes`  内容类型系统,用于给模型关联许可
    -------------------------------------------------------------------
    MIDDLEWARE中添加
    `SessionMiddleware`  通过请求管理会话
    `AuthenticationMiddleware`  将会话和用户关联
    
    

    二、用户对象

    在django中用户对象是用户认证系统的核心,只有一个用户模型就是User模型,它位于django.contrib.auth.models,使用auth_user表来存储用户数据

    1.创建用户

    create_user(username、password)-------普通用户

    from django.contrib.auth.models import User
    user = User.objects.create_user(username='用户名',password='密码',email='邮箱',...)
    
    user是一个User类的实例,已经保存在了数据库内,你可以随时修改它的属性,例如:
    user.last_name='fj'
    user.save()
    

    create_superuser(username、password)-----------超级用户

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

    2.修改密码

    注:Django默认会对密码进行加密,因此,不要对密码进行直接操作

    set_password(password)------设置密码

    user.set_password(password='')
    user.save()
    

    check_password(password)-----检查密码是否正确

    ok=user.check_password('密码')
    
    需要提供当前请求用户的密码,正确返回True,错误返回False
    

    3.用户验证

    authenticate()

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

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

    from django.contrib import auth
    user = authenticate(username='usernamer',password='password')
    if user:
        #认证成功
    else:
        #认证失败
    

    is_authenticated()用来判断是否通过了认证

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

    4.User对象的属性

    • is_staff:用户是否拥有网站的管理权限
    • is_active:是否允许用户登录,设置为False可以在不删除用户的前提下禁止用户登录

    三、在视图中认证用户

    django使用session和中间件关联请求对象中和认证系统,每一次请求都包含一个request.user属性,表示当前用户,如果用户未登录,该值为AnonymousUser实例(匿名用户),如果登录它就是一个User模型的实例。

    1.登录用户

    login(HttpRequest,user)---会将用户的ID保存在django的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:
            login(request,user)
            return HttpResponse('登录成功')
        else:
            return HttpResponse('用户名或密码错误')
        
    

    2.注销用户

    logout(request)----无返回值

    from django.contrib.auth import logout
       
    def logout_view(request):
      logout(request)
    
    • 当前请求的session信息会被全部删除,如果用户没有登录也不会报错

    3.登录认证装饰器

    login_requierd(redirect_field_name='next',login_url='/login/')

    用于给视图添加登录校验

    from django.contrib.auth.decorators import login_required
          
    @login_required
    def other_view(request):
      ...
    
    • redirect_field_name:修改的是浏览器 ? 后面的key值
    • login_url='/login/' 如果没有登录跳转到的页面 (局部设置)
    • settings.LOGIN_URL设置没有登录跳转的页面,传递当前路径为url字符串的参数(全局设置)
    • 如果已经登录,执行正常的视图

    四、扩展默认的auth_user表

    默认的auth_user表字段是固定的几个,需要扩展的话可以通过下面的方法

    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):
        """
        用户信息表
        """
        nid = models.AutoField(primary_key=True)
        phone = models.CharField(max_length=11, null=True, unique=True)
        
        def __str__(self):
            return self.username
    

    建好模型后需要在settings中配置,

    AUTH_USER_MODEL='app名.UserInfo'
    

    注:一旦指定了新的表模型,之前的表模型就不能用了。

  • 相关阅读:
    学习笔记——SQL SERVER2014内存数据库
    学习笔记——WCF
    线程
    文件内容操作类-RandomAccessFile
    文件操作类-file-创建文件夹
    同步方法解决同步问题
    同步代码块
    停止线程
    使用泛型来优化坐标类
    数据操作流-DataOutputStream
  • 原文地址:https://www.cnblogs.com/mangM/p/10020717.html
Copyright © 2020-2023  润新知