一個基於django框架的SQL 稽核系統二次開發

darren__chan發表於2019-07-09

發現自己最近已經焦頭爛額,每天在各種繁雜的事務中腦袋已經混亂不堪了。凌晨5點30分,失眠,把我在搞的一個SQL 稽核的專案理一理,準備新版本更新上線後就不管了。我的大腦容量真的有限了。

這是一個基於github上 https://github.com/hhyo/Archery  的一個依賴 Inception平臺 SQL稽核系統,我比較喜歡他基於bootstrap 前端的簡潔風格。


以下是它所用到的技術依賴:

框架

前端元件

服務端

功能依賴

而我的二次開發主要做什麼呢?

我從去年就開始在工作穿插著瞭解這個程式的結構,光在安裝除錯已經花了不少時間。後來決定推廣使用,在關於賬號登入這塊就不好搞了,該稽核系統已經加入LDAP 域登入,公司的域控剛好才剛開始推廣,我們大部分的開發還不習慣於域,而公司有自己的單點登入,於是我不得不在單點登入上進行改造,公司單點登入已經提供了介面,而我的認證步驟主要如下:

  1. 訪問稽核系統後判斷未登入便轉入單點登入登入介面頁面,此時附上自身在單點登入中APPID 

  2. 在單點登入系統上用統一賬號登入通過後,單點登入產生token資訊跳轉回SQL稽核系統

  3. 於是SQL 稽核系統在接收到token及其他相關資訊後再進行判斷認證。具體程式碼片段如下:

#cwd
# 登入頁面
def login(request):
    token = request.GET.get('token')
    logouturl = SSO_LOGOUT
    if request.user and request.user.is_authenticated:
        return HttpResponseRedirect('/')
    elif  token is None :
        return HttpResponseRedirect(SSO_INDEX)
    else:
        url = SSO_TOKEN + urllib.parse.quote(token)
        req = urllib.request.Request(url)
        res_data = urllib.request.urlopen(req)
        res = json.loads(res_data.read())
        if res.get('success'):
            username = res.get('loginid')
            userid = res.get('userid')
            auth =   svjAuth(request)
            tokenpwd = auth.getUser(username)
            if tokenpwd['status'] == 0:
                tokenpwd = tokenpwd['data']
                result = auth.authenticate(username, tokenpwd)
                if result['status'] == 0:
                    Users.objects.filter(username=username).update(ssouserid=userid)
                    return HttpResponseRedirect("/")
            elif tokenpwd['status'] == 1:
                Users.objects.filter(username=username).update(ssouserid=userid)
                data="使用者存在,請聯絡管理員申請tokenpwdkey"
                return render(request, 'login.html',{"data":data, "url":logouturl})
            elif tokenpwd['status'] == 2:
                data = "您還不是SQL稽核系統使用者,請聯絡管理員申請註冊"
                return render(request, 'login.html',{"data":data, "url":logouturl})
        else:
            data = "您還不是SQL稽核系統使用者,請聯絡管理員申請註冊HH"
            return render(request, 'login.html',{"data":data, "url":logouturl})

這裡要提一下的是關於在單點登入驗證通過後在SQL稽核系統需要進行認證,當時想直接繞過django的認證模組直接登入,研究了很長一段時間都還是無法通過,最終使用了比較土的辦法來進行認證。


之後,便是工作通知這一模組,archery已經整合郵件,釘釘機器人通知功能,而我需要對其進行改造的是將通知轉到公司自己的釘釘工作通知模組,這一模組其實也不是很複雜,同樣是呼叫既有的介面即可,主要程式碼片段:

    @staticmethod
    def send_oading(url, content, userlist):
        """
        傳送oa釘釘訊息
        :param url:
        :param content:
        :return:
        """
        head = {"Content-Type": "application/json; charset=UTF-8", 'Connection': 'close'}
        data = {
            "Appid": DING_APPID,
            "Message": "{}".format(content),
            "UserList": "{}".format(userlist),
        }
        #logger.debug(data)
        r = requests.post(url=url, json=data, headers=head)
        r_json = r.json()
        if r_json['Code'] == 200:
           logger.debug('oa釘釘推送成功')
        else:
            logger.error("""oa釘釘推送失敗
錯誤碼:{}
返回錯誤資訊:{}
請求url:{}
請求data:{}""".format(r_json['Code'], r_json['ErrorMessage'], url, data))


之後,因為要走工單話,就必須結合公司的OA流程,於是乎,只能在生成SQL稽核工單時將相應資訊推送到OA系統中,此時同樣是呼叫OA中發起工單的介面,這裡會根據OA自身的需求呼叫好幾個介面,這一階段開發花費了不少時間。

完成OA工單模組整合之後我們的系統開始推廣使用了。

在用是這樣的:


在使用一段時間後發現github上已經更新了好幾個版本,使用了不少新的功能比如 goInception,加上我發現現有的在提交工單時選擇資料庫管理起來比較麻煩。原來是通過使用者-使用者組-關聯資料庫例項-關聯例項所在的庫。這樣就需要每個小部門組都分配一個資料庫例項許可權了,我們的資料庫數量比較多,所以維護起來比較麻煩。

於是我進行了改造,改成了使用者-關聯資料庫的模式,使用者通過許可權申請來擁有自己的資料庫。

順便換了個  前端模板,個人表示前端模板這些css,js這些比後端python難搞了好多,這個花費了我不少時間,因為期間我嘗試換過好幾個模板。新的前端模板,使用了iframe,這裡遇到過不少坑,比如重新整理保留當前頁面問題,需要儲存iframe的src路徑等

資料庫許可權申請模組:  

SQL 上線提交:


另外,寫了段定時去檢查定時執行任務的程式碼,主要的二次開發就是這些了,更多的是希望改造得更加貼合我們的使用習慣,而整個基於核心inception模組還未涉獵,這部分相對比較完善了。詳細資訊可以去github上了解。

感謝github上前輩們的無私奉獻


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29863023/viewspace-2649913/,如需轉載,請註明出處,否則將追究法律責任。

相關文章