Django權限管理---自定義權限角色

Django權限管理的機制

  • Django權限管理的實現, 基於 User Group Permission,這個權限管理機制, 將模型類中的某個屬於model的permission賦予user或者group, group在後臺管理中就是角色的意思

默認的權限

  • 在INSTALL_APPS 裏設置了django.contrib.auth 時, 在一次遷移的時候,將爲模型類創建四個默認權限: 添加. 修改. 刪除和查看

  • Django自動生成的表結構
    在這裏插入圖片描述在這裏插入圖片描述

  • auth_group的表結構
    在這裏插入圖片描述

  • auto_group_permissions表結構
    在這裏插入圖片描述

  • auto_permission表結構
    在這裏插入圖片描述

以編程的方式的創建權限

  • 在項目中, auto_permission表中自動生成的權限可能不是我們需要的, 我們可以手動添加
from myapp.models import Tnews
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType

# 新聞表中權限
news_content_type = ContentType.objects.get_for_model(Tnews)
Permission.objects.update_or_create(codename='news_add', name='添加新聞', content_type=house_content_type)

添加角色

  • 項目中需要哪些角色, 自己添加哪些角色, 操作Group, 簡介操作的是 auto_group表
from django.contrib.auth.models import Group
from rest_framework.viewsets import ModelViewSet

class RoleManagerView(ModelViewSet):
    """角色管理視圖"""
    queryset = Group.objects.all()
    # 關閉分頁
    # pagination_class = None
    serializer_class = serializes.RoleManagerSerializer

給角色Group賦權限

  • 獲取這個Group的實例對象, 獲取需要添加的permission對象, 給角色添加權限
from django.contrib.auth.models import Group
# 獲取某個角色
instance = Group.objects.get(id=2)
# 獲取所有權限列表
Permission.objects.all()
# 獲取單條權限
permissino1 = Permission.objects.get(id=200)
# 將權限添加到Group中
instance.permissions.add(permissino1)
# 其他權限的操作
# 設置權限, 會清空之前的所有權限,傳入一個權限列表
instance.permissions.set([permission1...])
# 清空所有的權限
instance.permissions.clear()
# 查看所有的權限
instance.permissions.all()

給用戶賦角色

  • settings文件中設置好User模型類後, 遷移會生成 user表__groups 角色用戶關係表, 查出group的對象, 用戶添加這個組中
from django.contrib.auth.models import Group
from user.models import User
user = User.objects.get(id=1)
# 獲取一個角色
group1 = Group.objects.get(id=1)
# 將該用戶添加到這個組中
user.groups.add(group1)
# 其他操作
# 查看這個用戶的所有的組
user.groups.all()
# 清空這個用戶的組
user.groups.clear()
# 設置組, 會清空之前的所有組,傳入一個組列表
user.groups.set([group1])

給用戶賦值權限

  • User對象的user_permission字段管理用戶的權限
user = User.objects.get(id=1)
user.user_permissions = [permission_list]
user.user_permissions.add(permission, permission,) #增加權限
user.user_permissions.remove(permission, permission,) #刪除權限
user.user_permissions.clear() #清空權限
user.get_all_permissions() #列出用戶的所有權限
user.get_group_permissions() # 列出用戶所屬group的權限

權限驗證的使用

1. 裝飾器函數使用

  • 在視圖中驗證權限 permission_required裝飾器
from django.contrib.auth.decorators import login_required, permission_required

2. view視圖中代碼驗證

if not request.user.has_perm('news.news_lb_manager')

3. 模板中使用

# 登錄權限
{% if user.is_authenticated %}
    <p>Welcome, {{ user.username }}. Thanks for logging in.</p>
{% else %}
    <p>Welcome, new user. Please log in.</p>
{% endif %}
# 是否有權限
{% if perms.news.news_lb_manager%}
有權限
{% endif %}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章