權限和分組

 

權限:數據庫

    對錶或者模型級別設置權限。不能針對數據級別進行操做。django

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

  • codename:權限的名字; 
  • name:該權限的做用;   
  • content_type:表示該permission是屬於哪一個app下的哪一個models。

建立的模型默認就有三種:增、刪、改;可在數據庫中的 auth_permission 表中查看全部權限。ui

 

添加權限的方法:url

  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('權限建立成功!')

     

用戶與權限管理:spa

  • 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('添加權限操做成功!')

 

權限限定裝飾器:code

 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'))

 

分組:blog

  將權限歸類,添加到某個分組,把須要相同權限的用戶添加到同一分組中。在數據庫的 auth_group 表中,擁有id和name兩個字段。rem

分組操做:字符串

  • 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>
相關文章
相關標籤/搜索