注意:本文翻譯自django1.8的官方文檔
Permissions and Authorization
django提供了一個簡單的權限管理系統.它提供方法給指定的用戶和組分配權限
django的admin site使用了權限管理,然而你也可以你的代碼中使用.
django的admit site使用了permissions以下功能:
- 用戶瀏覽add表格和add對象,有add權限控制
- 用戶瀏覽change表格和change對象,有change權限控制
- 用戶刪除對象,有刪除權限控制
permissions不僅能用於每種對象,也能用於對象的實例.可以使用ModelAdmin類的has_add_permission(),has_change_permission(),has_delete_permission()方法來定給同一對象的不同實例來定製權限.
User對象有2個多對多字段:groups和user_permissions.User對象能像其他django模型一樣來連接它的關聯對象:
myuser.groups = [group_list]
myuser.groups.add(group, group, ...)
myuser.groups.remove(group, group, ...)
myuser.groups.clear()
myuser.user_permissions = [permission_list]
myuser.user_permissions.add(permission, permission, ...)
myuser.user_permissions.remove(permission, permission, ...)
myuser.user_permissions.clear()
Default permissions
當INSTALL_APPS列表裏有django.contrib.auth時,它會確保3個默認權限的存在:爲你安裝的app的模型創建add,change,delete權限
當你第一次運行manage.py migrate時,這些權限會被創建.以後再運行manage.py migrate時,只會會新添加的模型創建權限
假設你的應用有一個app_label叫foo,有一個模型叫Bar,你可以使用這些來測試基本權限:
- add: user.has_perm(‘foo.add_bar’)
- change: user.has_perm(‘foo.change_bar’)
- delete: user.has_perm(‘foo.delete_bar’)
很少直接訪問Permission模型
Groups
django.contrib.auth.models.Group模型是一個通用的給用戶分類的方法,這樣你就能分配權限,或其他標籤給用戶.一個用戶可以分配給任意一個或多個組.
用戶能自動化獲得所屬組的權限.例如,如果組Site editors有can_edit_home_page權限,該組下面的用戶就擁有這個權限.
除了權限,組還是一個方便的途徑來給用戶分類,給用戶貼上標籤,或者擴展功能.例如,你可以創建一個組叫’特殊用戶’,並且寫代碼,給特殊用戶訪問會員專區的權限,或者發送會員專屬郵件消息.
Programmatically creating permissions
除了在model的Meta class裏定製權限,還可以直接創建權限.例如,你可以在myapp裏給BlogPost模型創建can_publish權限:
from myapp.models import BlogPost
from django.contrib.auth.models import Group, Permission
from django.contrib.contenttypes.models import ContentType
content_type = ContentType.objects.get_for_model(BlogPost)
permission = Permission.objects.create(codename='can_publish',
name='Can Publish Posts',
content_type=content_type
)
通過User的user_permissions屬性可以分配權限,或者通過Group的permissions屬性
Permission caching
改變一個User對象的權限後,立即查看它的權限,會發現沒有改變,這是因爲有緩存.重新創建一個User對象,再查看權限,才能看到改變.例如:
from django.contrib.auth.models import Permisson, User
from django.shortcuts import get_object_or_404
def user_gains_perms(request, user_id):
user = get_object_or_404(User, pk=user_id)
# 任何權限檢查都會緩存到當前的權限集合
user.has_perm('myapp.change_bar')
permission = Permission.objects.get(codename='change_bar')
user.user_permissions.add(permission)
# 檢查緩存權限集合
user.has_perm('myapp.change_bar') # False
user = get_object_or_404(User, pk=user_id)
# 緩存權限重新從數據庫裏更新
user.has_perm('myapp.change_bar') # True