summary
開發(fā)后臺管理系統(tǒng),一般少不了權(quán)限分配問題,就拿我目前正在開發(fā)的業(yè)務(wù)管理系統(tǒng)來說吧,使用數(shù)據(jù)庫設(shè)計表可以方便的解決權(quán)限問題。下面我就來詳細闡述一波~ =w=
particulars
配一手權(quán)限一般總共需要五張表:
-
用戶表(user)
-
用戶角色表(roleuser)
-
角色表(role)
-
角色權(quán)限表(rolemenu)
-
權(quán)限表(menu)
其中,有三張是主表:用戶表、角色表、權(quán)限表,這三張表并沒有直接關(guān)系。另外兩張表起到連接作用的關(guān)系表,用戶角色表連接了用戶表和角色表;角色權(quán)限表連接了角色表和權(quán)限表。
一個用戶可能會擁有一個或多個角色,比如路人甲是A崗位的負責人,同時也是B崗位的負責人。用戶和角色是一對多的關(guān)系。同理,一個角色也可能會擁有一個或者多個權(quán)限,比如A崗位的負責人可以審批1號業(yè)務(wù),亦可審批2號業(yè)務(wù)。角色和權(quán)限亦是一對多的關(guān)系。由此兩中間表連接三張主表,最終可讓用戶和權(quán)限產(chǎn)生聯(lián)系。
下面容我更加細分的解釋
用戶——中間表——角色
首先是用戶表、用戶角色表與角色表。用戶角色表這張中間表只需要兩個字段,其中一個字段屬于用戶表,另一個屬于角色表,以此來讓兩表建立聯(lián)系。而用戶表,里面會包含例如出生年月,居住地等用戶的各種詳細信息。至于角色表,則是會包含各種角色的詳細信息??傊ㄟ^這三張表,我們可以知道一個用戶擁有哪些角色。
角色——中間表——權(quán)限
與上面同理。角色表、角色權(quán)限表、權(quán)限表。通過中間表的連接讓角色表與權(quán)限表產(chǎn)生關(guān)系,一個角色一般會擁有多個權(quán)限,通過這三張表,我們可以知道一個角色擁有哪幾個權(quán)限。
用戶——權(quán)限
既然知道了用戶與角色是一對多的關(guān)系、角色與權(quán)限是一對多的關(guān)系,就可以看出用戶與權(quán)限之間的關(guān)系了。通過這五張表,我們就可以查出,一個用戶擁有哪些權(quán)限了。每張表都是環(huán)環(huán)緊扣的,具體需要實現(xiàn)什么業(yè)務(wù)邏輯功能,也無非是這五張表之間的博弈了。

shiro
當然,以上是最原始最簡單的通過表管理權(quán)限,我們由上可以看出,如果只是單純的這樣做,最多只能精確到菜單(不同權(quán)限的用戶,登錄進去后顯示的菜單會不同),若是想精確到某個方法,或者是說某個按鈕,單靠這個是無法實現(xiàn)的,這時就出現(xiàn)了shiro。當然,實際上一般管理系統(tǒng)的權(quán)限管理都是交給shiro來做的。關(guān)于shiro,可參考開濤大佬的《跟我學(xué)shiro》,這個教程簡直詳細到令人發(fā)指,shiro的配置我就不做過多贅述了。
shiro官網(wǎng)首頁是這樣介紹shiro的:
Apache Shiro is a powerful and easy-to-use Java security framework that performs authentication, authorization, cryptography, and session management. With Shiro’s easy-to-understand API, you can quickly and easily secure any application – from the smallest mobile applications to the largest web and enterprise applications.
意思是說,shiro是一個功能強大且易于使用的Java安全框架,他可以用來做身份驗證、授權(quán)、加密和會話管理。
有幾個關(guān)鍵性的概念:
- Subject:一般來說都是代表當前登錄的用戶,獲得Subject對象之后我們可以通過Subject對象進行授權(quán)檢查。
- SecurityManager:Subject代表某一個用戶,而SecurityManager就是對這些Subject進行管理的對象,在web項目中使用shiro的時候,我們通常在xml文件中配置好SecurityManager對象,然后就不會跟它打太多的交道,而僅僅是訪問Subject的api。
- Realm:域,Realm表示驗證的數(shù)據(jù)源,存儲用戶的安全數(shù)據(jù),可以進行用戶名和密碼的匹配,及用戶權(quán)限查詢。我們需要編寫一個SimpleAuthorizingRealm類,繼承AuthorizingRealm,用來實現(xiàn)認證和管理的相關(guān)操作。
首先是身份驗證。
用戶登錄時需要提供信息來證明"你就是你,而不是別人",一般都是通過賬號(principals)和密碼(credentials)來驗證。登錄后,你的shiro會根據(jù)你的登錄信息查詢到你所在的user表的信息,通過上面所介紹的五張表的關(guān)系,可以直接查詢到當前登錄用戶的權(quán)限及其他所有相關(guān)信息,這些都是寫在SimpleAuthorizingRealm類里的。
再就是授權(quán)方式。
shiro的授權(quán)方式不止一種,一般采用的是在方法上面放置相應(yīng)的注解來完成,例如:
/**
* 跳轉(zhuǎn)到角色管理頁面
* @return
*/
@At
@RequiresPermissions("menu:view")
@Ok("beetl:/menu/index.html")
public Context index(){
Context ctx = Lang.context(); //返回的Map
ctx.set("menus",ShiroSession.getMenu()); //加載菜單
return ctx;
}
這里的
@RequiresPermissions("menu:view")
public Context index(){ }
意思是,subject中必須含有menu:view的權(quán)限才能執(zhí)行index()方法,否則會拋出異常AuthorizationException。
既然是精確到給具體的方法施加權(quán)限,也就是說權(quán)限已經(jīng)不止是精確到菜單,而是精確到按鈕了!這就是shiro關(guān)于授權(quán)的強大之處。
怎么樣?是不是一目了然了呢?O(∩_∩)O