實(shí)現業(yè)務(wù)系統中的用戶(hù)權限管理--實(shí)現篇
在設計篇中,我們已經(jīng)為大家闡述了有關(guān)權限管理系統的數據庫設計,在本篇中,我們將重點(diǎn)放在其實(shí)現代碼部分。為了讓你能夠更直接更有效的看到全部動(dòng)作的代碼,我們使用“動(dòng)作分解列表”的方式來(lái)陳述每個(gè)動(dòng)作以及相關(guān)資源。
實(shí)現權限管理功能的動(dòng)作
系統動(dòng)作
詳解模組:
1.setup(數據庫初始化、權限設置模組)
當布署好一個(gè)新的系統后,我們可以通過(guò)執行一個(gè)動(dòng)作setup來(lái)安裝數據庫和一些初始值,通過(guò)執行這個(gè)動(dòng)作系統可以正常運行。因為執行setup這個(gè)動(dòng)作時(shí)會(huì )調用到一個(gè)名稱(chēng)為setup的模組,這個(gè)模組的作用是初始化系統所用到的數據庫,并且在系統中設置動(dòng)作的權限,否則數據庫和有權限的動(dòng)作就沒(méi)辦法執行。下面我們來(lái)看一下setup模組的代碼,點(diǎn)擊這里查看代碼。這里我們把代碼拆分開(kāi)看一下,由于setup模組里有好多類(lèi)似的代碼,所以這里我們只找出不同功能的代碼做一下介紹:
第一段:數據庫安裝
在模組中首先調用了一個(gè)datebase_SQL_setup這個(gè)數據庫操作集,這個(gè)數據庫操作集用來(lái)為系統中的數據庫表(根據情況刪除或新建)做初始化。
第二段:添加權限信息
代碼中調用了action_I_newone這個(gè)數據庫操作集,在這個(gè)操作集中加入權限的名稱(chēng)和它的其它信息。
第三段:添加一個(gè)管理員
這部分代碼中調用了master_I_newone數據庫操作集在數據庫中添加了一個(gè)管理員的信息,這個(gè)信息是可以不寫(xiě)在這里的,可以直接在數據庫中添加,但是為了減少不必要的麻煩所以直接在這里添入了一個(gè)默認的管理員。
第四段:添加管理員組
通過(guò)調用groupmanager_I_newmaster這個(gè)數據庫操作集新建了一個(gè)管理員組,并加入了詳細的管理員組信息,可以把新用戶(hù)加入到此管理員組。
第五段:添加新的工具分欄
通過(guò)調用actioncolumn_I_newone數據庫操作集在工具欄里加入一個(gè)工具欄分欄選項。
第六段:指定管理組
通過(guò)調用mastergroup_I_newone數據庫操作集把admin這個(gè)用戶(hù)加入到第一個(gè)管理組里,使該用戶(hù)成為第一個(gè)管理組的成員。
最后一段:指定管理組擁有的權限
這段代碼首先調用了action_S_all數據庫操作集并使用Loop語(yǔ)句列出所有的動(dòng)作,然后調用actiongroup_I_newone這個(gè)數據庫操作集,把所有的動(dòng)作都加入到第一個(gè)管理組里,使第一個(gè)管理組擁有所有權限。
這里之所以把數據庫的安裝和權限的設置都放在模組里面,是為了使用戶(hù)使用更加方便,不需要再去重新手動(dòng)建庫,以減不在數據庫這方面的錯誤,使系統更加簡(jiǎn)單流暢。如果其它系統也需要權限這方面的管理,可以把模組稍做修改就可以直接拿來(lái)用,這樣也體現出代碼的重用性。
2.checkuserpurview(檢驗當前用戶(hù)能否執行該動(dòng)作的模組)
在權限管理系統中,模組checkuserpurview得到了反復使用,該模組擔負著(zhù)檢測用戶(hù)權限的任務(wù),在所有需要進(jìn)行訪(fǎng)問(wèn)權限控制的動(dòng)作的開(kāi)始部分都調用了該模組,所以理解該模組的代碼也有一定難度。下面,我們來(lái)看一看該模組的代碼。
我們將整段代碼拆分一下,首先看第一段,如下圖:
判斷_SESSION.myloginid的值是否為空,如果為空,在當前頁(yè)面中執行nosession這個(gè)動(dòng)作。我們在用戶(hù)登陸的動(dòng)作中login會(huì )為登陸的用戶(hù)使用myloginid的SESSION變量記錄下該用戶(hù)的ID,因此如果用戶(hù)是正常登陸并在SESSION有效期內的話(huà),則_SESSION.myloginid的值是不可能為空的。通過(guò)此部分代碼檢測用戶(hù)是否已經(jīng)登陸成功并獲得合法的訪(fǎng)問(wèn)身份。
然后看下面的代碼,如下圖:
調用數據庫操作集mastergroup_S_bymasterid,使用邏輯層的Loop,使用當前執行的action以及查詢(xún)返回的groupid作為條件,調用數據庫操作集actiongroup_S_byactionandgroupid進(jìn)行循環(huán)查詢(xún),如果查詢(xún)返回值大于0(零),將局部變量purview的值設置為1。
這段代碼的重點(diǎn)在于使用的Loop進(jìn)行循環(huán),由于actiongroup表中記錄著(zhù)用戶(hù)所處的管理組能夠執行的權限,并且一個(gè)用戶(hù)可能同時(shí)會(huì )屬于多個(gè)組,因此我們需要去檢驗用戶(hù)屬于的多個(gè)組中是否有對該動(dòng)作執行的權限,因此,我們使用當前需要執行的動(dòng)作action以及用戶(hù)所處的管理組groupid循環(huán)查詢(xún),當前用戶(hù)所屬于的組中只要有一個(gè)組具有執行該動(dòng)作的執行權限,則該用戶(hù)就可以執行該動(dòng)作。
最后一部分代碼如下圖:
再次使用判斷,如果purview的值不為1的話(huà),則在當前頁(yè)面執行nopurview動(dòng)作。
由于之前的代碼中,如果用戶(hù)擁有執行動(dòng)作的權限的話(huà),會(huì )將局部變量purview的值設置為1,所以這里如果該變量值不為1,就說(shuō)明了此用戶(hù)沒(méi)有執行動(dòng)作的權限,故執行nopurview動(dòng)作。
總結
從設計到實(shí)現,權限管理系統的教程到這里就全部結束了。在設計階段,最重要也是最難理解的是那兩張映射表的作用,理解了兩張映射表,基本上也就理解了整套數據庫的設計。而實(shí)現階段,比較難理解的就是上面說(shuō)到的模組checkuserpurview了。理解該模組,需要聯(lián)合數據庫設計,actiongroup表中記錄著(zhù)用戶(hù)組可以執行的權限,使用action字段和groupid字段進(jìn)行查詢(xún),返回的數大于1,說(shuō)明了用戶(hù)所在的組擁有執行該動(dòng)作的權限。
附錄
MYSQL版本權限管理系統源碼下載
MSSQL版本權限管理系統源碼下載