django1.8認證系統(2)

注意:本文翻譯自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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章