码迷,mamicode.com
首页 > 其他好文 > 详细

权限和分组

时间:2019-04-24 19:19:33      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:pre   定义   raise   页面   .text   let   查看   request   获取   

 

权限:

    对表或者模型级别设置权限。不能针对数据级别进行操作。

 django.contrib.auth.Permission 模型包含三个字段:

  • codename:权限的名字; 
  • name:该权限的作用;   
  • content_type:表示该permission是属于哪个app下的哪个models。

创建的模型默认就有三种:增、删、改;可在数据库中的 auth_permission 表中查看所有权限。

 

添加权限的方法:

  1. 定义模型:在模型的时候在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         ]

     

  2. 代码添加权限:用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>

 

权限和分组

标签:pre   定义   raise   页面   .text   let   查看   request   获取   

原文地址:https://www.cnblogs.com/liqiongming/p/10764054.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!