實現業務系統中的用戶權限管理--實現篇

 

 

 

實現業務系統中的用戶權限管理--實現篇

  在設計篇中,我們已經爲大家闡述了有關權限管理系統的數據庫設計,在本篇中,我們將重點放在其實現代碼部分。爲了讓你能夠更直接更有效的看到全部動作的代碼,我們使用“動作分解列表”的方式來陳述每個動作以及相關資源。

實現權限管理功能的動作

動作分解 動作名 相關表名 操作集類型
(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版本權限管理系統源碼下載


 

 

 



             NoahWeb因您而精彩!
 

 


 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章