Django的权限系统是怎样与数据库交互的
[*] 数据库表结构基础
[*]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表中插入一条记录,关联用户和用户组。
[*]比方,在代码中可以这样将用户添加到一个用户组:
from django.contrib.auth.models import User, Group
user = User.objects.get(id=1)
group = Group.objects.get(name='Editors')
user.groups.add(group)
[*]这会在auth_user_groups表中插入一条记录,表明id为1的用户属于Editors用户组。
[*]分配权限给用户组
[*]权限是通过用户组分配给用户的。在管理界面或者代码中为一个用户组分配权限时,会在auth_group_permissions表中插入记录。比方,通过代码为Editors用户组分配add_article和change_article权限:
from django.contrib.auth.models import Group, Permission
from django.contrib.contenttypes.models import ContentType
from.models import Article
group = Group.objects.get(name='Editors')
content_type = ContentType.objects.get_for_model(Article)
add_permission = Permission.objects.get(content_type=content_type, codename='add_article')
change_permission = Permission.objects.get(content_type=content_type, codename='add_article')
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企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]