摘要:文章通過節(jié)點,角色,用戶和這三者之間兩兩關系的數(shù)據庫表設計,實現(xiàn)了三個好處:系統(tǒng)的維護靈活度增加了,新增功能只需要簡單幾步就可以加入菜單;用戶對應多個角色可以減少了每個用戶設定權限的工作量;方便的生成每個用戶對應的菜單。
關鍵詞:訪問控制;權限管理;RBAC
中圖分類號:TP3092 文獻標識碼:A文章編號:1006-8937(2014)15-0074-01
1要求
①有三級菜單。②對不同的用戶顯示相應的菜單,用戶有權限的菜單才顯示,沒有權限的不顯示。③系統(tǒng)能在使用的同時不斷的加功能,也就是菜單會動態(tài)的增加。
2解決方法
①系統(tǒng)訪問URL形如:http://serverName/appName/mod-
ule/action/id/1/,這里的module是控制器,也是獨立的功能,action是方法,一個module對應0~N個action。②使用在用戶和菜單之間,加入角色概念。比如“管理員”有查看日志的功能。“產品”一般就是編輯功能。那產品主管就可以選定管理員+產品就可以了。而不用再新建一個“產品主管”的用戶。
使用5個數(shù)據表來實現(xiàn)這個功能,分別是Node(節(jié)點表)見表1,Role(角色表)見表2,user(用戶表)見表3,Node_role(節(jié)點-角色對應表)見表4,User_Role(用戶-角色對應表)見表5,數(shù)據表部分字段設計如下。
3基礎菜單的添加
這是整個系統(tǒng)初始化的基礎步驟,假設添加一級菜單三個排序分別為:基本信息、訂單、用戶。基本信息下有兩個二級菜單:新聞、商品,應該加入菜單表如:
①一級菜單的添加:INSERT INTO Node(name,level_1,level_2,level_3)VALUES(‘info’,1,0,0)。②二級菜單的添加:INSERT INTO Node(name,level_1,level_2,level_3)VALUES(‘news’,1,1,0)。
一,二級菜單的關聯(lián)完全是依據排序,和ID沒有關系,這樣的好處是:和界面設定的菜單直接對應起來,后面要加功能(三級菜單)的時候想加入第幾個一級菜單和第幾個二級菜單就可以直接填寫,直觀方便。
4菜單增加
這是基礎步驟。每當一個功能(控制器module)完成上線后,要把這個功能加入到系統(tǒng)的菜單。就是添加節(jié)點。一個控制器可以有N個節(jié)點,至少有一個節(jié)點,這個節(jié)點是它本身。其他的節(jié)點表示方法(action),比如常見的添加add,修改edit,刪除edit。
那么,假設把一個有添加add,修改edit,刪除del三個方法的焦點新聞功能加到二級菜單新聞(這個二級菜單新聞是前面定義好的,一級菜單排序1,二級菜單排序1)下,那么SQL語句如:
INSERT INTO NodeVALUES(,0,2,‘jd-news’,’焦點新聞’,1,1,1);
得到ID假設為888,接著添加方法:
INSERT INTO Node VALUES(,888,‘add’,,3,0,0,0);
INSERT INTO Node VALUES(,888,‘edit’,,3,0,0,0);
INSERT INTO Node VALUES(,888,‘del’,,3,0,0,0);
這樣,根據level_1,level_2,level_3的值,就可以得出控制器節(jié)點的排序位置,如果level_2,level_3為0,表示這個是一個一級菜單,如果level_3為0,那么這就是一個二級菜單,如果全為0,則表示這是某個控制器的方法。
5權限設定
分兩步:①給角色分配權限,最好是角色間的權限不重復。加入node_role節(jié)點角色對應表。②給用戶設定角色,一個用戶可以多個角色,加入user_role用戶角色對應表。
6前端菜單生成
這是重要的步驟,用戶登錄進入系統(tǒng)后,生成這個用戶對應的菜單。方法如下:
①獲取用戶ID,假設為888,初始化一個菜單數(shù)組menu。②查詢Node(節(jié)點表)生成菜單,先按順序生成一級菜單列表,加入菜單數(shù)組menu,每個菜單標志‘n’。③循環(huán)一級菜單,按順序生成每個二級菜單,加入菜單數(shù)組menu,每個菜單標志一個‘n’。④循環(huán)二級級菜單,按順序,并關聯(lián)用戶-角色對應表和節(jié)點-角色對應表,檢索出這個用戶可以訪問的節(jié)點列表。一一加入菜單數(shù)組,加入菜單數(shù)組的每個節(jié)點,都把它所對應的二級菜單和一級菜單的‘n’標志去掉,已經去掉的就忽略。⑤再循環(huán)一次菜單數(shù)組menu,把所有標志為‘no’的一級菜單和二級菜單去掉。
這就得到一個可用在前端顯示的菜單數(shù)組,形如:
$menu=array(\"基本信息\"=>array(\"新聞\"=>array(\"焦點新聞\"), \"商品\"),
\"用戶\"=>array(\"所有用戶\"=>array(\"用戶統(tǒng)計\"),);
‘no’標志的作用在于,一開始設定這個菜單不顯示,那么如果有查詢到這個菜單下的一個控制器(三級菜單)有權限,那么這個三級菜單所屬的二級菜單和一級菜單,都會顯示。最后再把‘no’標志的菜單都刪掉,這樣用戶就看不到自己沒有權限的其他菜單了。
7后端代碼驗證
為了防止有些非法用戶試圖通過直接輸入URL來訪問,那么在后端應該要做個檢測機制。可以在公共類里寫個檢測的方法。并且所有的控制器都繼承這個公共類。那么這個檢測的方法實現(xiàn)原理如下:
①獲取用戶的user_id,訪問的模型名module,訪問的方法名action。②查詢node表中這個節(jié)點的node_id,這里分兩小步:查詢node表中name=‘module’的ID假設為m_id;查詢node表中name=‘action’AND pid=m_id的ID為n_id。③依靠user_role.roleid=node_role.role_id這個條件,關聯(lián)用戶-角色對應表和節(jié)點-角色對應表這兩個表,查詢where node_
id=n_id的記錄。④如果有記錄,表示可以訪問;如果沒有記錄,拒絕訪問。
參考文獻:
[1] 信科,楊峰,楊光旭,等.基于RBAC權限管理系統(tǒng)的優(yōu)化設計與實現(xiàn)[J].計算機技術與發(fā)展,2011,(7).
[2] 倪東英,張曉麗.基于RBAC的用戶權限管理的設計與實現(xiàn)[J] 濟南大學學報(自然科學版),2010,(2).
[3] 馬麗,馬世龍,眭躍飛,等.一種RBAC的描述邏輯表示方法[J].計算機科學,2010,(3).