简介Django的用户及权限系统

用户系统

  • 1、用户
  • 2、权限
  • 3、分组
  • 4、一个可以配置的密码哈希系统
  • 5、一个可以插拔的后台管理系统

使用授权系统

  • app 引入
    • django.contrib.auth 模型定义
    • django.contrib.contenttypes 模型权限关联
  • 中间件
    • SessionMiddleware 用来管理session
    • AuthenticationMiddleware 管理和关联当前用户

User模型

  • 引入from django.contrib.auth.models import User
  • 创建用户
    • 创建普通用户User.objects.create_user(username='zr',email='[email protected]',password='111111')
    • 创建超级管理员User.objects.creat_superuser()
  • 修改密码
    • user.set_password 这个方法会对密码进行加密,然后调用user.save()保存
  • 验证用户名和密码
    • 引入from django.contrib.auth import authenticate用于验证用户名和密码
    • 成功返回用户对象,失败返回None

扩展用户模型

  • 使用代理模型

    • 1、新建模型继承User
    • 2、在内置的Meta类中声明,proxy=True
    • 3、代理类使用的就是原来的类。
  • 使用一对一外键的方式

    • 1、新建一个扩展模型
    • 2、进行一对一映射OneToOneField
    • 3、进行数据监听
    • 4、监听引入
      • from django.dispatch import receiver
      • from django.db.models.signals import post_save
    • 5、监听代码

    其中UserExtension为用户扩展表

    @receiver(post_save,sender=User)
    def handler_user_extension(sender,instance,created,**kwargs):
    if created:
    UserExtension.objects.create(user=instance)
    else:
    instance.extension.save()
    ```

    • 6、自定义验证系统
      • django默认email是唯一表示用户的,但是在日常开发中一般使用手机号作为标识
      • 其中验证用户密码 正确可以使用user.check_password(password)
  • 使用继承的方式

    • 1、定义新模型继承ABstractUser
    • 2、在’setting.py’中配置AUTH_USER_MODEL='模型路径(appname.modelsname)'
    • 3、注意:一定要在第一次执行数据库迁移之前配置
    • 4、重写objects
      • 1、需要重写UserManager
      • 2、继承BaseUserManager
      • 3、重写create_user和create_superuser两个方法
      • 4、在验证的时候传递的username是验证唯一性的,在USERNAME_FIELD = 'username'中配置,默认为username
  • 多重继承,去掉无用的user字段

    • 1、定义新模型继承AbstractBaseUser和PermissionsMixin,其中AbstractBaseUser包含两个字段,密码和最后登陆时间,PermissionsMixin验证权限
    • 2、定义相应的字段
      • 必须的字段
        • is_active
      • 必须属性
        • USERNAME_FIELD = 'telephone',用于验证唯一性的
        • REQUIRED_FIELDS = ['username'],用于在创建超级管理员时候提示的
      • 必须方法
        • get_full_name
        • get_short_name
    • 3、重写objects
    • 4、注意:一定要在第一次数据迁移之前完成
  • 获取用户模型的方法

    • 引入 from django.contrib.auth import get_user_model
    • 这个方法会根据setting.py中设置模型来获取相应的用户模型

权限系统

登陆

  • 在authenticate验证之后,如果验证通过会返回一个user对象,拿到user对象之后可以使用django.contrib.auth.login进行登陆
  • 自己定义的login函数不要叫做login,会与django自带的产生冲突。
  • 注意:在表单验证的时候,模型中唯一的字段,已经在数据库中保存过了将无法通过模型表单的验证,需要自己写。
  • 像 记住我 这样的按钮可以通过调整session过期时间来完成

退出登陆

  • 调用 django 中的logout
  • 退出登陆实现的功能其实就是将session设置为当前时间,即返回的session是已经过期的session

登陆限制

  • 引入from django.contrib.auth.decorators import login_required,装饰器,可以传递参数login_url=‘url’这个是如果未登陆将跳转到
  • 使用登陆限制的时候,可以登陆完成可以通过GET得到next,进行跳转跳转到原来的页面

权限引入

  • 在创建模型的时候默认会生成三条权限,增加,修改,删除
  • 可以在创建模型的时候自己添加权限
  • 在模型的Meta类中添加属性
    permissions = [
    	('view_article',"查看的权限"),# 第一个参数为权限名,第二个为权限描述
    ]
    
  • 通过模型添加权限
  • from django.contrib.auth.models import Permission,ContentType,引入权限模型和通过模型获取contenttype的方法
  • content_type = ContentType.objects.get_for_model()这个代码用来获取模型的位置
  • 创建权限的时候需要传的字段为(codename,name,content_type)分别是权限名,权限描述,模型位置

操作权限

  • 可以通过content_type来获取指定模型的权限
  • 可以通过user.user_permission.set(permissions)来向用户设置多个权限
  • 可以通过user.user_permission.clear()清空用户的所有权限
  • 可以通过user.user_permission.add(这里可以是一个权限,或者是打散的权限列表),添加权限
  • 可以通过user.user_permission.remove(这里可以是一个权限,或者是打散的权限列表)移除权限
  • 可以通过user.has_perm('appname.codename')appname 是app名,codename 是权限名,来判断这个用户有没有这个权限
  • 可以通过user.get_all_permissions()获取用户全部权限

权限验证

  • 使用request.user.is_authenticated可以判断用户是否已经登陆,登陆了返回True,没登陆返回Flase
  • 使用permission_required('appname.codename',login_url='',raise_exception=True),login_url 用户未登录跳转的url,raise_exception=True如果用户没权限将返回403状态,这个装饰器可以进行验证
  • permission_required第一个参数可以传列表代表多个权限同时具有
  • user.has_perms(['appname.codename','']),列表内权限同时具有的时候返回True

权限分组

  • 导入from django.contrib.auth.models import Group导入分组模型
  • 创建分组Group.objects.create(name="运营")
  • 添加权限group.permissions.set(permissions)
  • 为用户添加分组 user.groups.add(group)
  • 获取用户分组中的所有权限user.group.get_group_permissions()

模板使用权限

  • 在模板内使用{% if perms.appname.codename %}perms.appname.codename 当前用户具有这个权限的时候是True

你可能感兴趣的:(Django)