权限和分组
Posted liqiongming
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了权限和分组相关的知识,希望对你有一定的参考价值。
权限:
对表或者模型级别设置权限。不能针对数据级别进行操作。
django.contrib.auth.Permission 模型包含三个字段:
- codename:权限的名字;
- name:该权限的作用;
- content_type:表示该permission是属于哪个app下的哪个models。
创建的模型默认就有三种:增、删、改;可在数据库中的 auth_permission 表中查看所有权限。
添加权限的方法:
- 定义模型:在模型的时候在Meta中定义权限。
1 class Article(models.Model): 2 title = models.CharField(max_length=100) 3 content = models.TextField() 4 author = models.ForeignKey(get_user_model(),on_delete=models.CASCADE) 5 # 定义模型添加权限 6 class Meta: 7 permissions = [ 8 (‘删除‘,‘删除文章的权限‘) 9 ]
- 代码添加权限:用Permission模型创建权限
1 from django.contrib.auth.models import Permission,ContentType 2 from .models import Article 3 4 # 使用代码创建权限 5 def add_permission(request): 6 content_type = ContentType.objects.get_for_model(Article) 7 permission = Permission.objects.create(codename=‘black_article‘,name=‘拉黑文章‘,content_type=content_type) 8 return HttpResponse(‘权限创建成功!‘)
用户与权限管理:
- myuser.user_permissions.set(permission_list):给定一个权限的列表。
- myuser.user_permissions.add(permission,permission,...):一个个添加权限。
- myuser.user_permissions.remove(permission,permission,...):一个个删除权限。
- myuser.user_permissions.clear():清除权限。
- myuser.has_perm(‘<app_name>.<codename>‘):判断是否拥有某个权限。参数是一个字符串。
- myuser.get_all_permissons():获取所有的权限。
1 # 用户的权限管理; 2 def operate_permission(request): 3 user = User.objects.first() 4 print(user) 5 content_type = ContentType.objects.get_for_model(Article) 6 permissions = Permission.objects.filter(content_type=content_type) 7 # 添加多个或一个 8 user.user_permissions.set(permissions) 9 # user.user_permissions.add(permissions[0],permissions[1]) 10 # 删除 11 # user.user_permissions.clear() 12 if user.has_perm(‘front.view_article‘): 13 print(‘该用户拥有view权限‘) 14 else: 15 print(‘没有该权限‘) 16 # 查看拥有的所有权限 17 print(user.get_all_permissions()) 18 return HttpResponse(‘添加权限操作成功!‘)
权限限定装饰器:
1 from django.contrib.auth.decorators import permission_required 2 3 # 使用装饰器验证权限,raise_exception=True时,没权限会跳转到403页面; 4 @permission_required(‘front.add_article‘,login_url=‘/login/‘,raise_exception=True) 5 def add_article(request): 6 return HttpResponse(‘这是添加文章的页面‘) 7 8 # 使用装饰器可省略的代码 9 # 判断用户有没有登录 10 # if request.user.is_authenticated: 11 # print(‘已经登录‘) 12 # print(request.user.get_all_permissions()) 13 # if request.user.has_perm(‘front.add_article‘): 14 # return HttpResponse(‘这是添加文章的页面‘) 15 # else: 16 # return HttpResponse(‘没有访问该页面的权限!‘,status=403) 17 # else: 18 # print(‘没有登录‘) 19 # return redirect(reverse(‘login‘))
分组:
将权限归类,添加到某个分组,把需要相同权限的用户添加到同一分组中。在数据库的 auth_group 表中,拥有id和name两个字段。
分组操作:
- Group.object.create(group_name):创建分组。
- group.permissions:某个分组上的权限。多对多的关系。
- group.permissions.add:添加权限。
- group.permissions.remove:移除权限。
- group.permissions.clear:清除所有权限。
- user.get_group_permissions():获取用户所属组的权限。
- user.groups:某个用户上的所有分组。多对多的关系。
1 from django.contrib.auth.models import Group 2 3 def operate_group(request): 4 # 创建分组 5 # group = Group.objects.create(name=‘财务‘) 6 # content_type = ContentType.objects.get_for_model(Article) 7 # permissions = Permission.objects.filter(content_type=content_type) 8 # group.permissions.set(permissions) 9 # group.save() 10 # 将用户添加到分组中 11 # group = Group.objects.filter(name=‘财务‘).first() 12 # user = User.objects.filter(pk=5).first() 13 # user.groups.add(group) 14 # user.save() 15 # 判断用户是否有权限 16 user = User.objects.filter(pk=5).first() 17 if user.has_perm(‘front.add_article‘): 18 print(‘有添加文章的权限‘) 19 else: 20 print(‘没有添加文章的权限‘) 21 return HttpResponse(‘操作分组‘)
模板中使用权限:
在模板中使用 perms 获取用户的所有权限,单登录的用户拥有 add_article 的权限时,才显示 添加文章 的字样。
1 <!--index--> 2 <body> 3 首页 4 {% if perms.front.add_article %} 5 <a href="">添加文章</a> 6 {% endif %} 7 </body>
以上是关于权限和分组的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向Linux 文件权限 ( Linux 权限简介 | 系统权限 | 用户权限 | 匿名用户权限 | 读 | 写 | 执行 | 更改组 | 更改用户 | 粘滞 )(代码片段
SpringCloud系列十一:SpringCloudStream(SpringCloudStream 简介创建消息生产者创建消息消费者自定义消息通道分组与持久化设置 RoutingKey)(代码片段