在設計篇中,我們已經為大家闡述了有關許可權管理系統的資料庫設計,在本篇中,我們將重點放在其實現代碼部分。為了讓你能夠更直接更有效看到全部動作的代碼,我們使用“動作分解列表”的方式來陳述每個動作以及相關資源。
實現許可權管理功能的動作
動作分解 |
動作名 |
相關表名 |
操作集類型 (S,U,I,D,SQL) |
表單 |
模組 |
字元資源 |
是否分頁? |
返回提示? |
許可權檢測 |
許可權初始化安裝 |
setup |
無 |
無 |
無 |
setup |
setupok |
否 |
否 |
否 |
顯示添加管理組介面 |
addnewgroup |
無 |
無 |
addgroup |
checkuserpurview |
無 |
否 |
否 |
是 |
執行添加管理員動作 |
addnewgroup_ex |
gorupmanager、gorupmanager、mastergroup |
S、I、I |
無 |
checkuserpurview |
addok adderror |
否 |
是 |
是 |
顯示所有管理組列表以執行設定許可權動作 |
setgroupinfo |
無 |
無 |
無 |
checkuserpurview |
viewtitle list_allgroup |
是 |
否 |
是 |
顯示設定管理組許可權介面 |
setgroupinfo_input |
無 |
無 |
無 |
checkuserpurview |
viewtitle list_allgrouppurview del_confirm |
否 |
否 |
是 |
執行設定管理組許可權動作 |
setgroupinfo_ex |
actiongroup、action、actiongroup |
D、S、I |
無 |
checkuserpurview |
setgrouppurview loginjumpframe |
否 |
否 |
是 |
執行刪除管理組動作 |
delgroup_ex |
groupmaster、actiongroup |
D、D |
無 |
checkuserpurview checkpointid |
viewtitle do_ok list_allgroup |
是 |
是 |
是 |
顯示所有管理組列表以執行查看管理群組成員動作 |
viewgroupmaster |
無 |
無 |
無 |
checkuserpurview |
viewtitle list_allgroup |
是 |
否 |
是 |
查看所選擇管理組下的所有成員 |
viewmaster |
無 |
無 |
無 |
checkuserpurview |
viewtitle list_groupmaster |
是 |
否 |
是 |
顯示添加管理員介面 |
addnewmaster |
無 |
無 |
addnewmaster |
checkuserpurview |
無 |
否 |
否 |
是 |
執行添加管理員動作 |
addnewmaster_ex |
master、master、mastergroup |
S、I、I |
無 |
checkuserpurview |
addok adderror |
否 |
是 |
是 |
顯示所有管理員列表以執行設定管理員權限動作 |
setmasterpurview |
無 |
無 |
無 |
checkuserpurview |
viewtitle list_allmaster |
是 |
否 |
是 |
查看所選擇管理員所在管理組 |
setmasterpurview_input |
無 |
無 |
無 |
checkuserpurview |
viewtitle list_mastergroup |
是 |
否 |
是 |
執行設定所選管理員權限 |
setmasterpurview_ex |
mastergroup、mastergroup |
D、I |
無 |
checkuserpurview |
viewtitle do_ok loginjumpframe |
否 |
是 |
是 |
顯示所有管理員列表以執行設定管理員密碼動作 |
setmasterpass |
無 |
無 |
無 |
checkuserpurview |
viewtitle list_allmaster |
是 |
否 |
是 |
顯示密碼修改介面 |
setmasterpass_input |
無 |
無 |
masterpassword |
checkuserpurview |
無 |
否 |
否 |
是 |
執行修改管理員密碼動作 |
setmasterpass_ex |
master |
SQL |
無 |
checkuserpurview |
viewtitle do_ok |
否 |
是 |
是 |
顯示所有管理員列表以執行修改管理員資訊動作 |
setmasterinfo |
無 |
無 |
無 |
checkuserpurview |
viewtitle list_allmaster |
是 |
否 |
是 |
顯示所選擇管理員資訊修改介面 |
setmasterinfo_input |
master |
S |
editmasterinfo |
checkuserpurview |
del_confirm |
否 |
否 |
是 |
執行修改管理員資訊動作 |
setmasterinfo_ex |
master |
U |
無 |
checkuserpurview |
viewtitle do_ok list_allmaster |
是 |
是 |
是 |
執行刪除管理組動作 |
delmaster_ex |
master、actiongroup |
D、D |
無 |
checkuserpurview checkpointid |
viewtitle do_ok list_allmaster |
否 |
是 |
是 |
執行修改當前管理員密碼動作 |
setmyinfo_ex |
master |
U |
無 |
無 |
viewtitle do_ok |
否 |
是 |
是 |
顯示修改當前管理員資訊介面 |
setmyinfo |
master |
S |
editmasterinfo |
無 |
無 |
否 |
是 |
是 |
執行修改當前管理員密碼動作 |
setmypass_ex |
master |
SQL |
無 |
無 |
viewtitle do_ok |
否 |
是 |
是 |
顯示修改當前管理員密碼介面 |
setmypass |
無 |
無 |
masterpassword |
無 |
無 |
否 |
否 |
是 |
系統動作
動作分解 |
動作名 |
相關表名 |
操作集類型 (S,U,I,D,SQL) |
表單 |
模組 |
字元資源 |
是否分頁? |
返回提示? |
許可權檢測 |
當管理員第一次進入管理系統時將使用該動作 |
* |
無 |
無 |
login |
無 |
無 |
否 |
否 |
否 |
系統登入動作,管理員登入系時將使用該動作 |
login |
master |
SQL |
無 |
無 |
loginok loginjumpframe loginerror |
否 |
是 |
否 |
顯示視窗TITLE資訊 |
viewtoolstitle |
無 |
無 |
無 |
無 |
managertitle |
否 |
是 |
否 |
顯示左工具條 |
list_tools |
無 |
無 |
無 |
無 |
無 |
否 |
是 |
否 |
任務系統(預留) |
autoviewtask |
|
|
|
|
|
|
|
|
當使用者未進行登入而執行動作時會引發該動作 |
nosession |
無 |
無 |
無 |
無 |
nosession nosessionjumpframe |
否 |
是 |
否 |
當使用者進行刪除操作時未點擊確認時會引發該動作 |
nopointid |
無 |
無 |
無 |
無 |
nopointid |
否 |
是 |
否 |
當使用者試圖執行自己沒有許可權執行的動作時會引發該動作 |
nopurview |
無 |
無 |
無 |
無 |
nopurview |
否 |
是 |
否 |
退出系統 |
outlogin |
無 |
無 |
無 |
無 |
loginout nosessionjumpframe |
否 |
是 |
否 |
詳解模組:
1.setup(資料庫初始化、使用權限設定模組)
當布署好一個新的系統後,我們可以通過執行一個動作setup來安裝資料庫和一些初始值,通過執行這個動作系統可以正常運行。因為執行setup這個動作時會調用到一個名稱為setup的模組,這個模組的作用是初始化系統所用到的資料庫,並且在系統中設定動作的許可權,否則資料庫和有許可權的動作就沒辦法執行。下面我們來看一下setup模組的代碼,點擊這裡查看代碼。這裡我們把代碼拆分開看一下,由於setup模組裡有好多類似的代碼,所以這裡我們只找出不同功能的代碼做一下介紹:
第一段:資料庫安裝
在模組中首先調用了一個datebase_SQL_setup這個資料庫操作集,這個資料庫操作集用來為系統中的資料庫表(根據情況刪除或建立)做初始化。
第二段:添加許可權資訊
代碼中調用了action_I_newone這個資料庫操作集,在這個操作集中加入許可權的名稱和它的其它資訊。
第三段:添加一個管理員
這部分代碼中調用了master_I_newone資料庫操作集在資料庫中添加了一個管理員的資訊,這個資訊是可以不寫在這裡的,可以直接在資料庫中添加,但是為了減少不必要的麻煩所以直接在這裡添入了一個預設的管理員。
第四段:添加Administrator 群組
通過調用groupmanager_I_newmaster這個資料庫操作集建立了一個Administrator 群組,並加入了詳細的Administrator 群組資訊,可以把新使用者加入到此Administrator 群組。
第五段:添加新的工具分欄
通過調用actioncolumn_I_newone資料庫操作集在工具列裡加入一個工具列分欄選項。
第六段:指定管理組
通過調用mastergroup_I_newone資料庫操作集把admin這個使用者加入到第一個管理組裡,使該使用者成為第一個管理組的成員。
最後一段:指定管理組擁有的許可權
這段代碼首先調用了action_S_all資料庫操作集並使用Loop語句列出所有的動作,然後調用actiongroup_I_newone這個資料庫操作集,把所有的動作都加入到第一個管理組裡,使第一個管理組擁有所有許可權。
這裡之所以把資料庫的安裝和許可權的設定都放在模組裡面,是為了使使用者使用更加方便,不需要再去重新手動建庫,以減不在資料庫這方面的錯誤,使系統更加簡單流暢。如果其它系統也需要許可權這方面的管理,可以把模組稍做修改就可以直接拿來用,這樣也體現出代碼的重用性。
2.checkuserpurview(檢驗目前使用者能否執行該動作的模組)
在許可權管理系統中,模組checkuserpurview得到了反覆使用,該模組擔負著檢測使用者權限的任務,在所有需要進行存取權限控制的動作的開始部分都調用了該模組,所以理解該模組的代碼也有一定難度。下面,我們來看一看該模組的代碼。
我們將整段代碼拆分一下,首先看第一段,如:
判斷_SESSION.myloginid的值是否為空白,如果為空白,在當前頁面中執行nosession這個動作。我們在使用者登陸的動作中login會為登陸的使用者使用myloginid的SESSION變數記錄下該使用者的ID,因此如果使用者是正常登陸並在SESSION有效期間內的話,則_SESSION.myloginid的值是不可能為空白的。通過此部分代碼檢測使用者是否已經登陸成功並獲得合法的訪問身份。
然後看下面的代碼,如:
調用資料庫操作集mastergroup_S_bymasterid,使用邏輯層的Loop,使用當前執行的action以及查詢返回的groupid作為條件,調用資料庫操作集actiongroup_S_byactionandgroupid進行迴圈查詢,如果查詢傳回值大於0(零),將局部變數purview的值設定為1。
這段代碼的重點在於使用的Loop進行迴圈,由於actiongroup表中記錄著使用者所處的管理組能夠執行的許可權,並且一個使用者可能同時會屬於多個組,因此我們需要去檢驗使用者屬於的多個組中是否有對該動作執行的許可權,因此,我們使用當前需要執行的動作action以及使用者所處的管理組groupid迴圈查詢,目前使用者所屬於的組中只要有一個組具有執行該動作的執行許可權,則該使用者就可以執行該動作。
最後一部分代碼如:
再次使用判斷,如果purview的值不為1的話,則在當前頁面執行nopurview動作。
由於之前的代碼中,如果使用者擁有執行動作的許可權的話,會將局部變數purview的值設定為1,所以這裡如果該變數值不為1,就說明了此使用者沒有執行動作的許可權,故執行nopurview動作。
總結
從設計到實現,許可權管理系統的教程到這裡就全部結束了。在設計階段,最重要也是最難理解的是那兩張映射表的作用,理解了兩張映射表,基本上也就理解了整套資料庫的設計。而實現階段,比較難理解的就是上面說到的模組checkuserpurview了。理解該模組,需要聯合資料庫設計,actiongroup表中記錄著使用者組可以執行的許可權,使用action欄位和groupid欄位進行查詢,返回的數大於1,說明了使用者所在的組擁有執行該動作的許可權。
附錄
MYSQL版本許可權管理系統源碼下載
MSSQL版本許可權管理系統源碼下載