我對Django權限控制的理解

基於角色的權限系統html

       如今各大系統都採用的是基於角色的權限控制,這裏就涉及到三個東西:用戶、角色、資源(權限),在Django中就是:用戶、用戶組、權限。用戶和角色的關係通常爲多對多,角色和資源的關係也爲多對多,以下圖(此圖來源於互聯網)python

       這樣設計有一個好處,就是在系統愈來愈大的時候若是給每一個用戶逐一賦予權限很是麻煩和繁瑣,只須要給角色賦予相應的權限用戶賦予他對應的角色便可,若是有新的需求只須要添加有相應權限的角色便可。django

Django權限機制的實現框架

一、不依賴於Django中的權限模型ui

       設計三個實體類User、Role、Resource分別對應上面提出的用戶、角色、資源,User和Resource之間爲多對多的關係,Role和Resource之間爲多對多的關係。User中封裝的是用戶的信息如用戶名密碼等,Resource能夠封裝權限標識(後面再進行分析)也能夠封裝容許訪問的URL地址。spa

       編寫裝飾器對視圖處理方法進行攔截設計

  • 資源封裝URL

            在裝飾器中獲取當前訪問的URL,取出當前用戶(從Session中取,前題是在登陸的時候須要把用戶信息放去Session中去),迭代判斷用戶的全部角色綁定的資源中的URL,若是存在與當前訪問URL相同的地址則放行,不然則跳轉到無權限的頁面。code

            弊端:若是URL發生了變更須要修改資源(權限)htm

  • 資源封裝權限標識

            在裝飾器標示在視圖處理方法上時傳入權限標識參數(如:@auth("user:add")),在裝飾器中也是從Session中獲取用戶,迭代用戶的全部角色綁定的資源中的權限標識,若是與傳入裝飾器中的權限標識相同則放行,不然跳轉到無權限的頁面。繼承

            好處:若是URL發生了變更無需修改資源(權限),Django內部的權限系統就是採用的這種方式,Java目前愈來愈流行的權限控制框架Shiro也是採用的這種方式

二、依賴於Django中的權限模型(部分摘抄於:http://www.jianshu.com/p/01126437e8a4

         Django用User、Group、Permission來表示上面的用戶、角色、資源(權限),在Django中無論你是否使用其自帶的權限控制只要你繼承了他的模型類(models.Model)會默認在auth_permission表中插入三個權限信息(以Book爲例,會插入以下三個權限信息:add_book、change_book、delete_book,分別表明了添加、修改、刪除三個權限),若是須要更多的權限信息能夠在定義實體的時候以下定義:

class Book(models.Model):
    name = models.CharField()

    class Meta:
        permissions = (
            ('自定義的權限標識', '權限說明信息'),
        )

        每一個permission都是django.contrib.auth.Permission類型的實例,該類型包含三個字段name, codename 和 content_type,其中 content_type反應了permission屬於哪一個model(如上就是Book),codename就是權限標識,代碼邏輯中檢查權限時要用, name是permission的描述顯示的時候會用到。

        權限檢測裝飾器:request.user封裝了當前登陸系統的用戶

from django.contrib.auth.decorators import permission_required

@permission_required('應用名.權限標識')
def view(request):
    ....

       在模版中使用:模版中使用全局變量perms存儲當前用戶的全部權限

{% if perms.應用名.權限標識 %}
    <!-- 這裏是有權限才顯示的內容 -->
{% endif %}
相關文章
相關標籤/搜索