• 权限和分组


    权限:

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

     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>
  • 相关阅读:
    Codeforces 570E
    Codeforces 570D
    Codeforces 1136E
    Codeforces 570
    小白学习sprint boot容易遇到了一些问题
    力扣 234. 回文链表
    力扣198. 打家劫舍
    力扣543. 二叉树的直径
    力扣141.环形链表
    剑指offer1.跳台阶 & 力扣70.爬楼梯
  • 原文地址:https://www.cnblogs.com/liqiongming/p/10764054.html
Copyright © 2020-2023  润新知