在設計篇中,我們已經為大家闡述了有關權限管理系統的資料庫設計,在本篇中,我們将重點放在其實作代碼部分。為了讓你能夠更直接更有效的看到全部動作的代碼,我們使用“動作分解清單”的方式來陳述每個動作以及相關資源。
實作權限管理功能的動作
動作分解 | 動作名 | 相關表名 | 操作集類型 (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資料庫操作集在資料庫中添加了一個管理者的資訊,這個資訊是可以不寫在這裡的,可以直接在資料庫中添加,但是為了減少不必要的麻煩是以直接在這裡添入了一個預設的管理者。
第四段:添加管理者組
通過調用groupmanager_I_newmaster這個資料庫操作集建立了一個管理者組,并加入了詳細的管理者組資訊,可以把新使用者加入到此管理者組。
第五段:添加新的工具分欄
通過調用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版本權限管理系統源碼下載下傳