Django權限使用總結

概述

Django自帶有用戶驗證系統,它能夠處理User、Group、permission以及基於用戶cookie的session。這個文檔是基於Django官網文檔的介紹,以及其餘的資料整理而來。主要的內容介紹了Django的用戶驗證系統的基本工做原理,而且也會對於如何爲你的項目定製用戶驗證作出簡單介紹。django

Permission在Django中的工做原理

首先,咱們須要定義permission對象,而這個對象在定義的時候是須要與對應的model綁定的。
而後,定義好的permission就能夠賦予給user或者group對象,實現permission與用戶的綁定。
最後,在view以及template中能夠經過API對於user或者group進行權限的校驗了。cookie

權限的定義

permission可使用多種方式進行定義:session

在model中定義

咱們能夠在model的Meta中對permission進行定義。
官網示例以下:app

clipboard.png

單獨定義

或者能夠在獨立於model以外的位置定義。
官網示例以下:google

clipboard.png

不綁定特定的model定義

以上的兩個例子都是須要咱們已經具備model的狀況下才能定義permission,若是咱們尚未model的狀況下,又想要定義permission的話,應該怎麼處理呢?雖然這個需求有點奇怪
引用至GoogleGroup一個不存在的頁面url

url_content_type = ContentType.objects.create(
    name='url permission', app_label='crashstats', model='unused')

can_view_url = Permission.objects.create(
    name='can view url', content_type=url_content_type,
    codename='can_view_url')

user = User.objects.get(username='example_user', is_superuser=False)
user.user_permissions.add(can_view_url)

這樣經過綁定到一個不存在的model來實現也是支持的。實際使用中發如今定義ContentType的時候,給model賦值空字符串也是可行的,可是None則不行。spa

一個更爲通用的解決方案3d

這樣就會獲得咱們所定義的permission對象了。並且Django會爲每一個permission賦予一個全局惟一的code,規則:<app_label>.<permission_codename>。經過這個code就能夠指定相應的permissioncode

權限的授予

權限的授予能夠經過user或者group來進行。
user經過user_permissions屬性設置permission,group經過permissions屬性設置permission。對象

官網示例以下:

clipboard.png

權限的校驗

在view中校驗權限

利用decorator校驗

官網示例以下:

clipboard.png

注意:permissions除了用string指定單個權限以外,還支持list以及tuple用於多個權限。

利用Mixin校驗

官網示例以下:

clipboard.png

在template中校驗權限

若是在Django的settings裏面設置了django.contrib.auth.context_processors.auth,以及啓用了RequestContext的話,那Django就會默認在template中傳遞兩個變量:

  • {{ user }}

  • {{ perms }}

其中的{{ perms }}變量就能夠實如今template使用permission,從而達到經過不一樣的permission提供不一樣的template的功能。

實際上Django在template當中對於permission的使用提供了兩個API的功能,一個是User.has_module_perms;另外一個是User.has_perm。
當你在template中使用{{ perms.foo }}的時候就會調用User.has_module_perms方法,若是用戶具備foo這個permission的話,這個值就會爲True。
當你在template中使用{{ perms.foo.can_vote }}的時候就會調用User.has_perm方法,若是用戶具備foo.can_vote這個permission的話,這個值就會爲True。

permission在template中的使用示例:

clipboard.png
clipboard.png

參考文檔

官網認證系統文檔
官網ContentType文檔
官網自定義校驗文檔

相關文章
相關標籤/搜索