48.auth认证系统中Group模型和Permission模型

2,056 阅读6分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

1.Django权限系统auth模块中的——Group模型

django.contrib.auth.models.Group定义了用户组的模型, 每个用户组拥有id和name两个字段, 该模型在数据库被映射为auth_group数据表。 在这里插入图片描述 User对象中有一个名为groups的多对多字段, 多对多关系由auth_user_groups数据表维护。Group对象可以通过user_set反向查询用户组中的用户。

我们可以通过创建删除Group对象来添加或删除用户组:

导入使用的函数:

from django.contrib.auth.models import Group 

(1)添加用户组——add

group = Group.objects.create(name=group_name)
group.save()

(2)删除用户组——del

group.delete()

我们可以通过标准的多对多字段操作管理用户与用户组的关系:

注意:下述的user是获取到的user实例,group也是获取到的group实例。比如: user = User.objects.get(id=1) group = Group.objects.get(id=1)

  • 用户加入用户组:user.groups.add(group)或group.user_set.add(user)

  • 用户退出用户组:user.groups.remove(group)或group.user_set.remove(user)

  • 用户退出所有用户组:user.groups.clear()

  • 用户组中所有用户退出组:group.user_set.clear()

2.Django权限系统auth模块中的——Permission模型

Django的auth系统提供了模型级的权限控制, 即可以检查用户是否对某个数据表拥有增(add), 改(change), 删(delete)权限。

auth系统无法提供对象级的权限控制, 即检查用户是否对数据表中某条记录拥有增改删的权限。如果需要对象级权限控制可以使用django-guardian。假设在博客系统中有一张article数据表管理博文, auth可以检查某个用户是否拥有对所有博文的管理权限, 但无法检查用户对某一篇博文是否拥有管理权限。

查看数据库中auth_permission这张表,在里面有所有的表的一些操作权限,这些是在表创建的同是添加进来的数据(你会发现对应表的权限的名字是由其模型类名构成的!)

在这里插入图片描述 知识补给站:

  1. 每个模型默认拥有增(add), 改(change), 删(delete)权限。在django.contrib.auth.models.Permission模型中保存了项目中所有权限。

  2. 该模型在数据库中被保存为auth_permission数据表。每条权限拥有id ,name , content_type_id, codename四个字段。

①检查用户权限:

user.has_perm方法用于检查用户是否拥有操作某个模型的权限:

user.has_perm('blog.add_article') user.has_perm('blog.change_article') user.has_perm('blog.delete_article')

  • 上述语句检查用户是否拥有blog这个app中article模型的添加权限, 若拥有权限则返回True。

  • has_perm仅是进行权限检查, 即用户没有权限它也不会阻止用户执行相关操作。

②permission_required装饰器——设置权限:

permission_required修饰器可以代替has_perm并在用户没有相应权限时重定向到登录页或者抛出异常。

@permission_required(appname.codename(权限名称)) 给名为blog的app当中的博客添加视图设置权限:

from django.contrib.auth.decorators import permission_required

@permission_required('blog.add_blogmodel')		# 给对应的视图设置权限,让除了超级用户之外的用户丧失设置的权限!可以依此方法设置任意四种权限!
def add_get_post(request):
	...

这样的话只有被设置拥有此权限的用户才可访问此视图函数对应的前端页面(注意:如果是超级用户是拥有所有权限的)。

哪怕你登录了普通用户会发现也访问失败,它会自动给你跳转到你settings.py文件中设置的权限不足而跳转到的页面里!(此处为登录页面。)

在这里插入图片描述

③管理用户权限——单用户管理&&分组管理:

第一个:单用户管理!

User和Permission通过多对多字段user.user_permissions关联,在数据库中由auth_user_user_permissions数据表维护。

  • 添加权限: user.user_permissions.add(permission)

  • 删除权限: user.user_permissions.delete(permission)

  • 清空权限: user.user_permissions.clear()

实战使用——给指定用户添加权限(直接在前面的博客小案例上操作):

通过观察auth_permission权限表可知:如果你要给指定用户添加某个权限,那实现的方法就是通过用户信息表auth_user和权限信息表auth_permissons由于多对多关系产生的中间表auth_user_user_permissions的操作来完成,即让指定的用户与要添加的权限产生关系!(多对多表关系的添加)

①注意:要导入权限表! 在这里插入图片描述

②图个方便,直接找个视图在里面进行操作: 在这里插入图片描述

③现在如果访问博客添加页面,哪怕你登录了普通用户(id为1)会发现也可以访问,这就说明咱给这个普通用户成功添加了添加权限!

第二个:分组管理!

用户拥有他所在用户组的权限, 使用用户组管理权限是一个更方便的方法。Group中包含多对多字段permissions, 在数据库中由auth_group_permissions数据表维护。

  • 添加权限: group.permissions.add(permission)

  • 删除权限: group.permissions.delete(permission)

  • 清空权限: group.permissions.clear()

实战使用——给组添加权限(直接在前面的博客小案例上操作):

如何理解?试想上面给少数用户添加权限不是很麻烦,但是如果要给好多的用户添加权限岂不是很麻烦,所以又了给组添加权限的概念。我们可以将删除权限设置成一个组;查看权限设置成一个组...如果来了几十个需要添加查看权限的用户,只需将它们都扔进查看权限那个组即可!而且如果以后要对拥有查看权限的用户的权限进行改动或者升级,这样也非常方便!

组信息表的结构:

在这里插入图片描述

①注意:导入组信息表 在这里插入图片描述

②通过观察组信息表的结构创建组:

在这里插入图片描述 在这里插入图片描述 ③为新创建的组添加权限(此处是添加了添加权限!):

在这里插入图片描述

④举例将一个用户扔进组中,说明如何将用户放进具有权限的组中: 在这里插入图片描述

⑤现在如果访问博客添加页面,哪怕你登录了普通用户(id为3)会发现也可以访问,这就说明咱给这个普通用户成功添加了添加权限!

🔆In The End!

请添加图片描述

从现在做起,坚持下去,一天进步一小点,不久的将来,你会感谢曾经努力的你!

本博主会持续更新爬虫基础分栏及爬虫实战分栏,认真仔细看完本文的小伙伴们,可以点赞收藏并评论出你们的读后感。并可关注本博主,在今后的日子里阅读更多爬虫文!

如有错误或者言语不恰当的地方可在评论区指出,谢谢!
如转载此文请联系我征得本人同意,并标注出处及本博主名,谢谢 !