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 %}