django用户和权限

用户权限关系

  • 首先:django的权限系统是针对模型的权限,并且这个权限只是标识,在具体认证的时候需要自己实现,但django提供了相关函数用来判断用户是否具有某个权限。
    django用户和权限_第1张图片
  1. 这其中模型表、权限表会在执行命令python manage.py migrate的时候,自动为每个模型在模型表添加一条记录,,并且会为每一个模型在权限表中添加四条记录,这四条的codename分别是add_Modeldelete_Modelchange_Modelview_Model分别对应增删改查、CURD操作。
  2. 为用户分配的单个权限会存入用户权限表(具体看图)这个中间表中(因为用户和权限是多对多的关系)。
  3. 一般采用分组的方式为分组分配权限。分组需要自己根据需求创建,分组的权限会存入分组权限表(如图)这个中间表中(因为分组和权限也是多对多的关系)。
  4. 可以为用户选择他对应的分组会存入用户分组表(如图)这个中间表中(因为用户和分组也是多对多的关系)。
  5. 如果想要查询一个用户的所有权限:
    1. 查询用户权限表中有的所有权限
    2. 查询用户所属的所有分组
    3. 查询用户所属分组的全部权限

常用的方法

  1. ContentType.objects.get_for_model(model):用来根据模型来获取content_type,返回的一个content_type对象
  2. ContentType.objects.get_for_models(*model):用来根据模型来获取content_type,返回的是一个字典,以模型为键,以content_type为值的字典。
  3. 可以通过user.user_permission.set(permissions)来向用户设置多个权限
  4. 可以通过user.user_permission.clear()清空用户的所有权限
  5. 可以通过user.user_permission.add(这里可以是一个权限,或者是打散的权限列表),添加权限
  6. 可以通过user.user_permission.remove(这里可以是一个权限,或者是打散的权限列表)移除权限
  7. 可以通过user.has_perm('appname.codename')appname 是app名,codename 是权限名,来判断这个用户有没有这个权限
  8. user.has_perms(['appname.codename']):只有全部具有权限的时候才会返回真
  9. 可以通过user.get_all_permissions()获取用户全部权限

一个小栗子

from django.core.management.base import BaseCommand
from django.contrib.auth.models import Group,ContentType,Permission
from apps.meituan.models import Merchant,GoodsCategory,Goods
class Command(BaseCommand):
    def handle(self, *args, **options):
        # 编辑组
        edit_group = Group.objects.create(name='编辑')
        edit_content_types = list(ContentType.objects.get_for_models(
                                        Merchant,GoodsCategory,Goods).values())
        edit_permissions = Permission.objects.filter(content_type__in=edit_content_types)
        edit_group.permissions.set(edit_permissions)
        edit_group.save()
        self.stdout.write('编辑组创建成功')

使用python manage.py initgroup执行
在这里插入图片描述

你可能感兴趣的:(Django)