Django的权限系统是怎样与数据库交互的

农民  金牌会员 | 2024-12-29 15:49:00 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 820|帖子 820|积分 2460


  • 数据库表结构基础

    • Django的权限系统主要依赖于几个核心的数据库表,这些表是在执行数据库迁移(python manage.py migrate)时,由Django自动创建的,前提是django.contrib.auth应用在INSTALLED_APPS中。
    • auth_user表:存储用户信息。它包含了如id、username、password、email等字段。如果是自定义用户模子(继承自AbstractUser或AbstractBaseUser),这个表的结构会根据自定义模子的字段进行扩展。比方,自定义用户模子添加了一个phone_number字段,那么这个字段也会出现在auth_user(或者自定义的用户表)中。
    • auth_group表:用于存储用户组信息。表中有id和name等字段,用户组可以用于批量管理用户权限。
    • auth_permission表:存储权限信息。包含id、name(权限名称)、codename(权限代码名,如add_user)、content_type_id(关联到具体的模子)等字段。这个表定义了可以授予用户或用户组的各种权限。
    • auth_user_groups表:是一个多对多关系表,用于关联用户和用户组。它有id、user_id和group_id字段,通过这些字段可以知道每个用户属于哪些用户组。
    • auth_group_permissions表:同样是一个多对多关系表,用于关联用户组和权限。它有id、group_id和permission_id字段,记录了每个用户组拥有哪些权限。

  • 权限分配与数据库操作

    • 创建用户和权限关联

      • 当在Django管理界面(通过django.contrib.admin)或者代码中创建一个用户时,用户记录会被插入到auth_user表中。如果将用户添加到一个用户组,会在auth_user_groups表中插入一条记录,关联用户和用户组。
      • 比方,在代码中可以这样将用户添加到一个用户组:
      1. from django.contrib.auth.models import User, Group
      2. user = User.objects.get(id=1)
      3. group = Group.objects.get(name='Editors')
      4. user.groups.add(group)
      复制代码
         

      • 这会在auth_user_groups表中插入一条记录,表明id为1的用户属于Editors用户组。

    • 分配权限给用户组

      • 权限是通过用户组分配给用户的。在管理界面或者代码中为一个用户组分配权限时,会在auth_group_permissions表中插入记录。比方,通过代码为Editors用户组分配add_article和change_article权限:
      1. from django.contrib.auth.models import Group, Permission
      2. from django.contrib.contenttypes.models import ContentType
      3. from.models import Article
      4. group = Group.objects.get(name='Editors')
      5. content_type = ContentType.objects.get_for_model(Article)
      6. add_permission = Permission.objects.get(content_type=content_type, codename='add_article')
      7. change_permission = Permission.objects.get(content_type=content_type, codename='add_article')
      8. group.permissions.add(add_permission, change_permission)
      复制代码
         

      • 这会在auth_group_permissions表中插入两条记录,将Editors用户组与add_article和change_article权限关联起来。


  • 权限检查与数据库查询

    • 基于用户的权限检查

      • 当在视图函数或者其他业务逻辑中检查用户是否具有某个权限时,Django会进行一系列数据库查询。比方,利用user.has_perm('app_label.codename')方法来检查用户是否具有特定权限(如user.has_perm('blog.add_article'))。
      • 这个检查过程首先会查看用户所属的用户组(通过auth_user_groups表),然后检查这些用户组所拥有的权限(通过auth_group_permissions表),同时也会检查用户直接拥有的权限(auth_permission表中与用户关联的权限),以此来确定用户是否具有指定的权限。

    • 基于模子的权限检查(在管理界面等)

      • 在Django的管理界面或者其他基于模子的操作中,会根据用户对模子的权限来决定是否显示添加、修改、删除等操作按钮。这涉及到对auth_permission表以及用户和用户组权限关联表的查询,以确定用户对特定模子的操作权限。比方,对于Article模子,如果用户没有change_article权限,在管理界面的Article列表页面就不会显示修改文章的按钮。



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

农民

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表