用户认证组件

认证系统

auth模块

  1. auth_user表:

    • auth_user表存储用户信息

    • 模块导入

      from django.contrib import auth
      
    • 命令行添加用户. auth_user表是django自带,并不是models.py创建

      python manage.py createsuperuser
      
    • auth_user表结构

      username: 用户名. 150字符,唯一
      first_name: 30字符. 可为空
      last_name: 30字符, 可为空
      email: 可为空
      password: 哈希加密后的密码
      is_staff: 是否可进入admin站点.是否为员工.不使用admin可以忽略
      is_active: 是否可用.如要删除账号的数据,设置此值为false,不是真正的从数据库删除
      is_superuser: 是否超级管理员,超级管理员拥有整个网站的所有权限
      last_login: 上次登陆时间
      date_joined: 账号创建时间
      
  2. auth_user方法:

    • authenticate(username=.., password=…)

      • 用户认证,验证用户名和密码
      • 需要username,password两个关键字参数,即auth_user表字段
      • 用户名和密码认证:即auth_user表是否存在记录
        • 认证成功: 返回user对象
        • 认证失败: 返回None
      from django.contrib.auth import authenticate # 方法导入
      
      user_obj = auth.authenticate(username='sunny', password='password')
      
    • **login(HttpRequest, user)**

      • 用户登陆. 本质上会在后端为该用户生成相关的session数据, 保持会话
      • 参数: HttpRequest对象. 经过认证的user对象
      • 使用django的session框架给某个已认证的用户附加上session id等信息
      from django.contrib.auth import authenticate, login
      
      user_obj = auth.authenticate(username='sunny', password='password')
      if user_obj:
          # 保存用户状态信息
          login(request, user_obj) # request.session['session_id']=user_obj.pk
          # redirect to a sucess page.
          .....
      else:
          # return an 'invalid login' error message
          .....
      
      • 没有经过login方法封装的用户, 是匿名用户

      • 只要使用login(request, user_obj)之后,request.user 就能取得当前登陆的用户对象. 否则request.user得到的是一个匿名用户对象(AnonymousUser Object, request.user默认值), 值都为空或false

      • request.user对象本身是全局对象,可以直接在模板中使用{{request.user.username}}

        详见AuthenticationMiddleware 中间件源码

    • logout(request)

      • 注销用户, 当前请求的用户session信息全部清除
      • 用户没有登陆,使用该函数也不会报错
      • 无返回值
      from django.contrib.auth import logout
      
      def logout_view(request):
          logout(request)
          # redirect to login page
      
原文地址:https://www.cnblogs.com/relaxlee/p/12944282.html