1. 程式人生 > >DEVOPS 運維開發系列五:基於Django過濾器實現自動化運維平臺功能模組的動態授權管理與展示

DEVOPS 運維開發系列五:基於Django過濾器實現自動化運維平臺功能模組的動態授權管理與展示

1、關於Django過濾器

Django中提供了很多內建的過濾器和標籤,我們常用的例如下面這些:

  • block(模板繼承)
  • extends(模板繼承)
  • filter(過濾器)
  • for(迴圈)
  • if(判斷)
  • include(載入模板)

還有很多詳見官網。Django還提供了自定義標籤和過濾器的功能。關於自定義過濾器的使用方法並不是本文的重點,不熟悉的同學請自行從網上查詢些參考資料。

自定義過濾器是一個可以接受一個或兩個引數的python函式:

變數的值(輸入)並不必要是一個字串。引數的值,這個可以有一個預設的值或者完全留空。

舉個例子,在過濾器 {{ var|foo:"bar" }} 中,過濾器foo將傳遞變數var和引數“bar”。

2、關於在自動化運維平臺中按使用者或使用者組進行功能模組授權的使用需求

初期我們在建設和運營自動化運維平臺時,只有系統運維人員做一些資產、配置或服務管理使用,但是隨著平臺功能的不斷豐富,尤其是引入了多種角色的使用者後,如產品人員、研發或測試人員,我們就遇到了怎麼給使用者提供一些恰當的平臺功能授權的問題。從資訊保安和系統安全形度考慮,系統管理人員、產品人員、產品運維人員、研發人員,都需要有一套自己適用的平臺功能檢視,只看到和使用自己需要的、有許可權的功能或服務即可。因此,我們就按需定製設計和開發了下面這樣的一套平臺功能模組授權管理系統,主要的實現思路是建立一套平臺功能模組以及平臺導航欄選單項的資訊管理體系,將平臺使用者/使用者組與功能模組建立規則對映關係,最終通過Django自定義過濾器的方式在平臺WEB頁面上對平臺提供的功能模組按使用者具備的授權規則進行過濾,然後展示給使用者一個正確使用許可權的頁面檢視。

3、建立一套平臺功能模組以及平臺導航欄選單項的資訊管理體系

如下圖所示,我們將平臺中相對獨立的功能模組抽象為網站導航欄目樹中的一級節點選單項,按需將功能模組中的子模組定義出二級選單節點或更多級別的選單項。

Django Model建表設計:

基本上包含了各種用於展示WEB頁面導航樹欄目需要使用到的屬性資訊

class Navigation(models.Model):
    """
    Navigation for website on the left page.
    """
    name = models.CharField(unique=True, max_length=64, verbose_name=u"名稱")
    li_id = models.CharField(max_length=32, blank=True, null=True, verbose_name=u"圖示ID")
    css_class = models.CharField(max_length=32, blank=True, null=True, verbose_name=u"圖示樣式")
    level = models.IntegerField(choices=NAVI_LEVEL, blank=True, null=True, default=1, verbose_name=u"導航欄級別")
    url = models.CharField(max_length=64, blank=True, null=True, verbose_name=u"服務URL")
    display_order = models.IntegerField(max_length=11, blank=False, null=False, verbose_name=u"顯示順序")
    status = models.IntegerField(choices=ON_OFF, blank=True, null=True, default=1, verbose_name=u"啟用")
    upper_column = models.IntegerField(max_length=11, blank=True, null=True, default=0, verbose_name=u"上級欄目")
    comment = models.CharField(max_length=128, blank=True, null=True, verbose_name=u"備註")

    def __unicode__(self):
        return self.name

    class Meta:
        ordering = ['display_order']

4、設定平臺使用者/使用者組與功能模組間的對映關係規則

1)按使用者角色設計出不同功能許可權的授權規則

 

2)編輯授權規則的頁面

在這裡演示的是將使用者組與選定的一組功能欄目建立對映關係,這樣以後有類似許可權使用需求的新使用者時,只需要配置為屬於該使用者分組即可同步得具備以下這些平臺功能欄目的使用授權。

 

3)檢視授權規則詳情

5、利用Django自定義過濾器動態查詢和展示使用者的平臺功能選單檢視

1)利用自定義過濾器動態查詢使用者授權資訊

主要功能是通過menu_filter_by_user_id(user_id)和get_next_menus(menu_id, user_id)這兩個過濾器函式實現的。它們的功用如下所述:

  • menu_filter_by_user_id(user_id),根據傳入的使用者ID引數,查詢該使用者擁有的平臺功能授權資訊,最終將該使用者有使用許可權的網站導航欄一級欄目資料返回;
  • get_next_menus(menu_id, user_id),根據傳入的使用者ID和導航選單項ID引數,查詢該使用者具有哪些子選單的使用許可權,並將子一級欄目作為返回資料;

 

2)利用自定義過濾器幫助展示使用者的平臺功能導航欄選單檢視

如下圖所示,在平臺的導航欄部分使用一段for迴圈來實現了導航樹各級節點的展示。

載入自定義標籤和過濾器:

{% load mytags %}

獲取使用者的導航欄一級欄目項並展示為樹的一級節點:

{% for navigation in session_user_id|menu_filter_by_user_id %}

獲取使用者的指定一級導航欄目項的二級子節點並展示:

{% for navi in navigation.id|get_next_menus:session_user_id %}

以上只實現了兩級欄目的一個導航樹,很容易可以拓展為一顆不限子欄目級別的樹,方法如下。

  • 將上面第2個for迴圈中包含的內容替換為一行: {% include "nav_submenu.html" %}
  • 建立一個名為nav_submenu.html的頁面,如下圖所示,然後在本頁面的for迴圈中繼續include本身即可。只要你預先定義好的導航樹有足夠多的欄目層次關聯關係,就可以逐層得展示出來。

3)我們看一下在前面4.2章節中定義的"資料庫服務類欄目基礎授權"的展示效果

我們使用一個平臺使用者,設定為屬於"資料庫服務使用者組",然後登入平臺後,所見的導航樹欄目選單如下圖所示。