實(shí)現(xiàn)權(quán)限管理功能的動(dòng)作
動(dòng)作分解 | 動(dòng)作名 | 相關(guān)表名 | 操作集類(lèi)型 (S,U,I,D,SQL) |
表單 | 模組 | 字符資源 | 是否分頁(yè)? | 返回提示? | 權(quán)限檢測(cè) |
權(quán)限初始化安裝 | setup | 無(wú) | 無(wú) | 無(wú) | setup | setupok | 否 | 否 | 否 |
顯示添加管理組界面 | addnewgroup | 無(wú) | 無(wú) | addgroup | checkuserpurview | 無(wú) | 否 | 否 | 是 |
執(zhí)行添加管理員動(dòng)作 | addnewgroup_ex | gorupmanager、gorupmanager、mastergroup | S、I、I | 無(wú) | checkuserpurview | 否 | 是 | 是 | |
顯示所有管理組列表以執(zhí)行設(shè)置權(quán)限動(dòng)作 | setgroupinfo | 無(wú) | 無(wú) | 無(wú) | checkuserpurview | 是 | 否 | 是 | |
顯示設(shè)置管理組權(quán)限界面 | setgroupinfo_input | 無(wú) | 無(wú) | 無(wú) | checkuserpurview | 否 | 否 | 是 | |
執(zhí)行設(shè)置管理組權(quán)限動(dòng)作 | setgroupinfo_ex | actiongroup、action、actiongroup | D、S、I | 無(wú) | checkuserpurview |
setgrouppurview
|
否 | 否 | 是 |
執(zhí)行刪除管理組動(dòng)作 | delgroup_ex | groupmaster、actiongroup | D、D | 無(wú) | 是 | 是 | 是 | ||
顯示所有管理組列表以執(zhí)行查看管理組成員動(dòng)作 | viewgroupmaster | 無(wú) | 無(wú) | 無(wú) | checkuserpurview | 是 | 否 | 是 | |
查看所選擇管理組下的所有成員 |
viewmaster | 無(wú) | 無(wú) | 無(wú) | checkuserpurview | 是 | 否 | 是 | |
顯示添加管理員界面 |
addnewmaster | 無(wú) | 無(wú) | addnewmaster | checkuserpurview | 無(wú) | 否 | 否 | 是 |
執(zhí)行添加管理員動(dòng)作 | addnewmaster_ex | master、master、mastergroup | S、I、I | 無(wú) | checkuserpurview | 否 | 是 | 是 | |
顯示所有管理員列表以執(zhí)行設(shè)置管理員權(quán)限動(dòng)作 | setmasterpurview | 無(wú) | 無(wú) | 無(wú) | checkuserpurview | 是 | 否 | 是 | |
查看所選擇管理員所在管理組 | setmasterpurview_input | 無(wú) | 無(wú) | 無(wú) | checkuserpurview | 是 | 否 | 是 | |
執(zhí)行設(shè)置所選管理員權(quán)限 |
setmasterpurview_ex | mastergroup、mastergroup | D、I | 無(wú) | checkuserpurview | viewtitle do_ok loginjumpframe
|
否 | 是 | 是 |
顯示所有管理員列表以執(zhí)行設(shè)置管理員密碼動(dòng)作 | setmasterpass | 無(wú) | 無(wú) | 無(wú) | checkuserpurview | 是 | 否 | 是 | |
顯示密碼修改界面 |
setmasterpass_input | 無(wú) | 無(wú) | masterpassword | checkuserpurview | 無(wú) | 否 | 否 | 是 |
執(zhí)行修改管理員密碼動(dòng)作 |
setmasterpass_ex | master | SQL | 無(wú) | checkuserpurview | viewtitle do_ok |
否 | 是 | 是 |
顯示所有管理員列表以執(zhí)行修改管理員信息動(dòng)作 |
setmasterinfo | 無(wú) | 無(wú) | 無(wú) | checkuserpurview | 是 | 否 | 是 | |
顯示所選擇管理員信息修改界面 |
setmasterinfo_input | master | S | editmasterinfo | checkuserpurview | del_confirm | 否 | 否 | 是 |
執(zhí)行修改管理員信息動(dòng)作 |
setmasterinfo_ex | master | U | 無(wú) | checkuserpurview | viewtitle do_ok list_allmaster
|
是 | 是 | 是 |
執(zhí)行刪除管理組動(dòng)作 | delmaster_ex | master、actiongroup | D、D | 無(wú) | 否 | 是 | 是 | ||
執(zhí)行修改當(dāng)前管理員密碼動(dòng)作 | setmyinfo_ex | master | U | 無(wú) | 無(wú) | 否 | 是 | 是 | |
顯示修改當(dāng)前管理員信息界面 | setmyinfo | master | S | editmasterinfo | 無(wú) | 無(wú) | 否 | 是 | 是 |
執(zhí)行修改當(dāng)前管理員密碼動(dòng)作 | setmypass_ex | master | SQL | 無(wú) | 無(wú) | 否 | 是 | 是 | |
顯示修改當(dāng)前管理員密碼界面 | setmypass | 無(wú) | 無(wú) | masterpassword | 無(wú) | 無(wú) | 否 | 否 | 是 |
系統(tǒng)動(dòng)作
動(dòng)作分解 | 動(dòng)作名 | 相關(guān)表名 | 操作集類(lèi)型 (S,U,I,D,SQL) |
表單 | 模組 | 字符資源 | 是否分頁(yè)? | 返回提示? | 權(quán)限檢測(cè) |
當(dāng)管理員第一次進(jìn)入管理系統(tǒng)時(shí)將使用該動(dòng)作 | * | 無(wú) | 無(wú) | login | 無(wú) | 無(wú) | 否 | 否 | 否 |
系統(tǒng)登錄動(dòng)作,管理員登錄系時(shí)將使用該動(dòng)作 | login | master | SQL | 無(wú) | 無(wú) | 否 | 是 | 否 | |
顯示窗口TITLE信息 | viewtoolstitle | 無(wú) | 無(wú) | 無(wú) | 無(wú) | managertitle | 否 | 是 | 否 |
顯示左工具條 | list_tools | 無(wú) | 無(wú) | 無(wú) | 無(wú) | 無(wú) | 否 | 是 | 否 |
任務(wù)系統(tǒng)(預(yù)留) | autoviewtask | ||||||||
當(dāng)用戶未進(jìn)行登錄而執(zhí)行動(dòng)作時(shí)會(huì)引發(fā)該動(dòng)作 | nosession | 無(wú) | 無(wú) | 無(wú) | 無(wú) | 否 | 是 | 否 | |
當(dāng)用戶進(jìn)行刪除操作時(shí)未點(diǎn)擊確認(rèn)時(shí)會(huì)引發(fā)該動(dòng)作 | nopointid | 無(wú) | 無(wú) | 無(wú) | 無(wú) | nopointid | 否 | 是 | 否 |
當(dāng)用戶試圖執(zhí)行自己沒(méi)有權(quán)限執(zhí)行的動(dòng)作時(shí)會(huì)引發(fā)該動(dòng)作 | nopurview | 無(wú) | 無(wú) | 無(wú) | 無(wú) | nopurview | 否 | 是 | 否 |
退出系統(tǒng) | outlogin | 無(wú) | 無(wú) | 無(wú) | 無(wú) | 否 | 是 | 否 |
詳解模組:
1.setup(數(shù)據(jù)庫(kù)初始化、權(quán)限設(shè)置模組)
當(dāng)布署好一個(gè)新的系統(tǒng)后,我們可以通過(guò)執(zhí)行一個(gè)動(dòng)作setup來(lái)安裝數(shù)據(jù)庫(kù)和一些初始值,通過(guò)執(zhí)行這個(gè)動(dòng)作系統(tǒng)可以正常運(yùn)行。因?yàn)閳?zhí)行setup這個(gè)動(dòng)作時(shí)會(huì)調(diào)用到一個(gè)名稱(chēng)為setup的模組,這個(gè)模組的作用是初始化系統(tǒng)所用到的數(shù)據(jù)庫(kù),并且在系統(tǒng)中設(shè)置動(dòng)作的權(quán)限,否則數(shù)據(jù)庫(kù)和有權(quán)限的動(dòng)作就沒(méi)辦法執(zhí)行。下面我們來(lái)看一下setup模組的代碼,點(diǎn)擊這里查看代碼。這里我們把代碼拆分開(kāi)看一下,由于setup模組里有好多類(lèi)似的代碼,所以這里我們只找出不同功能的代碼做一下介紹:
第一段:數(shù)據(jù)庫(kù)安裝
在模組中首先調(diào)用了一個(gè)datebase_SQL_setup這個(gè)數(shù)據(jù)庫(kù)操作集,這個(gè)數(shù)據(jù)庫(kù)操作集用來(lái)為系統(tǒng)中的數(shù)據(jù)庫(kù)表(根據(jù)情況刪除或新建)做初始化。
第二段:添加權(quán)限信息
代碼中調(diào)用了action_I_newone這個(gè)數(shù)據(jù)庫(kù)操作集,在這個(gè)操作集中加入權(quán)限的名稱(chēng)和它的其它信息。
第三段:添加一個(gè)管理員
這部分代碼中調(diào)用了master_I_newone數(shù)據(jù)庫(kù)操作集在數(shù)據(jù)庫(kù)中添加了一個(gè)管理員的信息,這個(gè)信息是可以不寫(xiě)在這里的,可以直接在數(shù)據(jù)庫(kù)中添加,但是為了減少不必要的麻煩所以直接在這里添入了一個(gè)默認(rèn)的管理員。
第四段:添加管理員組
通過(guò)調(diào)用groupmanager_I_newmaster這個(gè)數(shù)據(jù)庫(kù)操作集新建了一個(gè)管理員組,并加入了詳細(xì)的管理員組信息,可以把新用戶加入到此管理員組。
第五段:添加新的工具分欄
通過(guò)調(diào)用actioncolumn_I_newone數(shù)據(jù)庫(kù)操作集在工具欄里加入一個(gè)工具欄分欄選項(xiàng)。
第六段:指定管理組
通過(guò)調(diào)用mastergroup_I_newone數(shù)據(jù)庫(kù)操作集把a(bǔ)dmin這個(gè)用戶加入到第一個(gè)管理組里,使該用戶成為第一個(gè)管理組的成員。
最后一段:指定管理組擁有的權(quán)限
這段代碼首先調(diào)用了action_S_all數(shù)據(jù)庫(kù)操作集并使用Loop語(yǔ)句列出所有的動(dòng)作,然后調(diào)用actiongroup_I_newone這個(gè)數(shù)據(jù)庫(kù)操作集,把所有的動(dòng)作都加入到第一個(gè)管理組里,使第一個(gè)管理組擁有所有權(quán)限。
這里之所以把數(shù)據(jù)庫(kù)的安裝和權(quán)限的設(shè)置都放在模組里面,是為了使用戶使用更加方便,不需要再去重新手動(dòng)建庫(kù),以減不在數(shù)據(jù)庫(kù)這方面的錯(cuò)誤,使系統(tǒng)更加簡(jiǎn)單流暢。如果其它系統(tǒng)也需要權(quán)限這方面的管理,可以把模組稍做修改就可以直接拿來(lái)用,這樣也體現(xiàn)出代碼的重用性。
2.checkuserpurview(檢驗(yàn)當(dāng)前用戶能否執(zhí)行該動(dòng)作的模組)
在權(quán)限管理系統(tǒng)中,模組checkuserpurview得到了反復(fù)使用,該模組擔(dān)負(fù)著檢測(cè)用戶權(quán)限的任務(wù),在所有需要進(jìn)行訪問(wèn)權(quán)限控制的動(dòng)作的開(kāi)始部分都調(diào)用了該模組,所以理解該模組的代碼也有一定難度。下面,我們來(lái)看一看該模組的代碼。
我們將整段代碼拆分一下,首先看第一段,如下圖:
判斷_SESSION.myloginid的值是否為空,如果為空,在當(dāng)前頁(yè)面中執(zhí)行nosession這個(gè)動(dòng)作。我們?cè)谟脩舻顷懙膭?dòng)作中login會(huì)為登陸的用戶使用myloginid的SESSION變量記錄下該用戶的ID,因此如果用戶是正常登陸并在SESSION有效期內(nèi)的話,則_SESSION.myloginid的值是不可能為空的。通過(guò)此部分代碼檢測(cè)用戶是否已經(jīng)登陸成功并獲得合法的訪問(wèn)身份。
然后看下面的代碼,如下圖:
調(diào)用數(shù)據(jù)庫(kù)操作集mastergroup_S_bymasterid,使用邏輯層的Loop,使用當(dāng)前執(zhí)行的action以及查詢返回的groupid作為條件,調(diào)用數(shù)據(jù)庫(kù)操作集actiongroup_S_byactionandgroupid進(jìn)行循環(huán)查詢,如果查詢返回值大于0(零),將局部變量purview的值設(shè)置為1。
這段代碼的重點(diǎn)在于使用的Loop進(jìn)行循環(huán),由于actiongroup表中記錄著用戶所處的管理組能夠執(zhí)行的權(quán)限,并且一個(gè)用戶可能同時(shí)會(huì)屬于多個(gè)組,因此我們需要去檢驗(yàn)用戶屬于的多個(gè)組中是否有對(duì)該動(dòng)作執(zhí)行的權(quán)限,因此,我們使用當(dāng)前需要執(zhí)行的動(dòng)作action以及用戶所處的管理組groupid循環(huán)查詢,當(dāng)前用戶所屬于的組中只要有一個(gè)組具有執(zhí)行該動(dòng)作的執(zhí)行權(quán)限,則該用戶就可以執(zhí)行該動(dòng)作。
最后一部分代碼如下圖:
再次使用判斷,如果purview的值不為1的話,則在當(dāng)前頁(yè)面執(zhí)行nopurview動(dòng)作。
由于之前的代碼中,如果用戶擁有執(zhí)行動(dòng)作的權(quán)限的話,會(huì)將局部變量purview的值設(shè)置為1,所以這里如果該變量值不為1,就說(shuō)明了此用戶沒(méi)有執(zhí)行動(dòng)作的權(quán)限,故執(zhí)行nopurview動(dòng)作。
總結(jié)
從設(shè)計(jì)到實(shí)現(xiàn),權(quán)限管理系統(tǒng)的教程到這里就全部結(jié)束了。在設(shè)計(jì)階段,最重要也是最難理解的是那兩張映射表的作用,理解了兩張映射表,基本上也就理解了整套數(shù)據(jù)庫(kù)的設(shè)計(jì)。而實(shí)現(xiàn)階段,比較難理解的就是上面說(shuō)到的模組checkuserpurview了。理解該模組,需要聯(lián)合數(shù)據(jù)庫(kù)設(shè)計(jì),actiongroup表中記錄著用戶組可以執(zhí)行的權(quán)限,使用action字段和groupid字段進(jìn)行查詢,返回的數(shù)大于1,說(shuō)明了用戶所在的組擁有執(zhí)行該動(dòng)作的權(quán)限。