06.Django-用户认证

用户认证

Django 内置一个 auth 模块,帮助用户实现注册、登陆、注销以及修改密码等功能,帮助开发者省去了不少功夫python

用于认证的数据表

  • auth_user
    • User是auth模块中维护用户信息的关系模式(继承了models.Model), 数据库中该表被命名为auth_user
  • auth_group
  • auth_user_user_permissions
    • User和Permission经过多对多字段user.user_permissions关联,在数据库中由auth_user_user_permissions数据表维护。
  • auth_user_groups
    • User对象中有一个名为groups的多对多字段, 多对多关系由auth_user_groups数据表维护。Group对象能够经过user_set反向查询用户组中的用户。
  • auth_group_permissions
  • auth_permission

django.contrib.auth模块

使用

要使用Django自带的认证功能,首先要导入auth模块数据库

from django.contrib import auth

auth提供的方法

  • authentioate()django

    提供了用户认证,即验证用户名以及密码是否正确,通常须要usernamepassword两个关键字参数;session

    若是经过认证,authentioate()函数会返回一个User对象;app

    authentioate()函数会在User对象上设置一个属性标识,这个属性标识通过数据库验证用户名和密码;函数

    当咱们试图登陆一个从数据库中直接取出来不通过authentioate()User对象时会报错。工具

  • login(request)网站

    接收一个HttpRequest对象,以及一个经过authentioate()函数认证的User对象;ui

    实现用户登陆功能,会在后台为登陆用户生成 session 数据;url

    执行过 login() 方法的用户对象,就能经过request.user 拿到当前登陆的用户对象,从而取出用户的相关信息,不然取得的将是一个匿名用户对象 AnonymounsUser Object

  • logout(request)

    接收一个HttpRequest对象,无返回值;

    当调用函数时,当前请求的session信息所有被清除;

    即便当前用户没有登陆,调用该函数也不会报错。

  • login_required()

    auth模块提供的一个装饰器工具,可以便捷地为某个视图添加登陆校验。

    若用户没有登陆,则默认会跳转到 accounts/login/,并传递当前访问 url 绝对路径。

    自定义跳转路径,只需在 settings.py 中添加:LOGIN_URL = '/login/'

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

User对象的方法

  • is_authentioated()

    检查用户是否已经经过了认证;

    若是是经过auth函数返回的真实的User对象,返回值则为True;

  • create_superuser()

    该方法用于建立一个超级用户,接收 username、password 两个必要参数。效果与执行 python manage.py createsuperuser 等同。

  • create_user()

    通常状况 create_superuser() 方法不多使用,最常使用的是create_user() 方法,它将会建立一个普通用户,常应用于注册视图中。

    建立用户所需字段,应与 auth_user 数据表中字段对应。

  • set_password[password]

    该方法用于修改密码,接收要新密码做为参数,最后必定要执行 save() 方法保存,不然无效。

  • check_password[password]

    检查登陆用户密码是否正确,须要当前请求用户的密码;

    密码正确返回 True,不然返回 False。

User对象属性

  • is_staff

    判断用户是否拥有网站的管理权限

  • is_active

    判断是否容许用户登陆。

    设置为False时能够不用删除用户来禁止用户登陆。

auth模块拓展

因为 auth 模板中 auth_user 数据表字段是固定的,所以当咱们使用 auth 模块,想要添加额外的字段时,就须要对其进行拓展。

拓展的方法:

  1. 模型中新增一个表,与 auth_user 表一对一关联

  2. 继承内置的 AbstractUser 类:经常使用

    1. 模型 models.py 中新建一个类,继承自 AbstractUser

      from django.contrib.auth.models import User, AbstractUser   # 导入 AbstractUser 类
      
      class UserInfo(AbstractUser):
          """
          继承 AbstractUser
          新增字段:phone、addr
          """
          phone = models.CharField(max_length=11, verbose_name='手机号码')
          addr = models.CharField(max_length=128, verbose_name='家庭地址')
    2. 配置 settings.py

      新增的类继承 AbstractUser ,拓展后将会覆盖 auth_user 表,所以须要配置 settings,使默认认证知道要使用哪一种表认证。

      # settings.py
      # 在最后添加以下代码
      AUTH_USER_MODEL = 'app名.新增的类名'
      
      AUTH_USER_MODEL = 'app.UserInfo'    # 示例
    3. 迁徙数据表

      python manage.py makemigrations
      python manage.py migrate
    4. 建立用户

      拓展 auth 模块后,使用的再也不是原来 auth_user 表,而是新表 app.UserInfo 表,所以在建立用户时应该注意。

      # 拓展以前
      from django.contrib.auth.models import User
      user_obj = User.objects.create_user(username='lila', password='1234')
      
      # 拓展以后
      from app.models import UserInfo
      user_obj = UserInfo.objects.create_user(username='lila', password='1234')
    • 若已经迁徙了模型,拓展 auth 模块时,须要将 migrations 文件夹下文件(如:0001_initial.py文件删除),不然会报 ValueError: Related model u'app.model' cannot be resolved
    • 若尚未迁徙模型,那么正常执行便可。
相关文章
相关标签/搜索