榮艷冬 馮建平
摘要:權(quán)限管理系統(tǒng)是現(xiàn)代軟件項(xiàng)目中必不可少的子系統(tǒng),用戶通常要求權(quán)限管理系統(tǒng)是細(xì)粒度和松耦合,盡量減少在權(quán)限系統(tǒng)開發(fā)中花費(fèi)更多的精力。Java項(xiàng)目中通常會將重復(fù)使用的技術(shù)封裝為框架,然后將框架掛接到實(shí)際項(xiàng)目中,從而大幅度提高項(xiàng)目制作效率和代碼質(zhì)量。該文主要討論Shiro框架在企業(yè)中的應(yīng)用,文章主要從Shiro的體系結(jié)構(gòu)、構(gòu)建和具體應(yīng)用三個(gè)方面進(jìn)行了詳細(xì)的闡述,通過對比闡明了Shiro框架在技術(shù)和使用等方面的優(yōu)勢。
關(guān)鍵詞:權(quán)限;JavaEE;框架;Shiro
中圖分類號:TP311 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2015)22-0067-02
權(quán)限管理是指根據(jù)系統(tǒng)設(shè)置的安全規(guī)則或者安全策略,用戶可以訪問而且只能訪問自己被授權(quán)的資源。在軟件項(xiàng)目中,幾乎所有的系統(tǒng)都需要權(quán)限管理系統(tǒng)。但是權(quán)限管理系統(tǒng)的設(shè)計(jì)是一件非常復(fù)雜的事情,它需要遵從這樣幾條原則:一是必須保障系統(tǒng)使用的安全,能夠覆蓋系統(tǒng)所有功能,所以通常要求權(quán)限管理系統(tǒng)是細(xì)粒度的;二是能夠方便快捷的進(jìn)行系統(tǒng)權(quán)限的分配,不受到用戶數(shù)量和用戶使用功能的限制,其中最長采用的是基于角色的訪問控制模型(RBAC);三是權(quán)限系統(tǒng)和業(yè)務(wù)相分離,無論從代碼層面,還是應(yīng)用層面,權(quán)限系統(tǒng)的開發(fā)和使用不受到業(yè)務(wù)的限制。
1 Java項(xiàng)目權(quán)限框架概述
Java項(xiàng)目中除了自己開發(fā)權(quán)限框架外,經(jīng)常會使用一些開源的權(quán)限框架,或者是在這些開源的框架上進(jìn)行二次開發(fā),使用權(quán)限框架可以大大簡化權(quán)限系統(tǒng)的開發(fā),能夠滿足大多數(shù)企業(yè)項(xiàng)目復(fù)雜的需求。常見的框架技術(shù)有Spring Security、AcegiSecurity、Kasai、ralasafe和Shiro等,每種框架都具有自己的特點(diǎn),也存在不能進(jìn)行細(xì)粒度控制、功能簡單、無法滿足用戶的需求和易用性差等缺點(diǎn)。
Shiro是眾多框架中表現(xiàn)相對較好的一個(gè),它是由Apache公司的開發(fā)的Java權(quán)限框架,它是基于RBAC的細(xì)粒度框架,從依賴關(guān)系來講,它不依賴任何框架技術(shù),可以獨(dú)立被使用,也可以和其他框架結(jié)合使用;從應(yīng)用范圍來講,它既可以被應(yīng)用到Web開發(fā),也可以被應(yīng)用到客戶端開發(fā);從具體應(yīng)用來講,它的配置非常簡單,易用性很強(qiáng),本文重點(diǎn)討論如何使用Shiro構(gòu)建權(quán)限管理系統(tǒng)。
2 使用Shiro構(gòu)建權(quán)限系統(tǒng)
2.1 Shiro框架的體系結(jié)構(gòu)
1)認(rèn)證(Authentication),它的功能是判斷用戶身份是否合法,通俗來講是登錄功能,這是權(quán)限系統(tǒng)最為基礎(chǔ)的功能,Shiro允許用戶對認(rèn)證方法重寫,從而根據(jù)項(xiàng)目的業(yè)務(wù)需求實(shí)現(xiàn)認(rèn)證。
2)授權(quán)(Authorization),這部分功能是權(quán)限系統(tǒng)的核心功能,Shiro是基于RBAC模型進(jìn)行授權(quán),它最基礎(chǔ)的內(nèi)容是權(quán)限點(diǎn),這也是細(xì)粒度控制的體現(xiàn)。通過授權(quán),Shiro框架將預(yù)先定義好的權(quán)限點(diǎn)和角色分配給用戶,用戶在認(rèn)證通過后,Shiro框架會約束用戶對于系統(tǒng)訪問的權(quán)限。
3)會話管理(Session Management),Web項(xiàng)目中通常具備會話管理功能,例如:Java Web中通常使用HttpSession類進(jìn)行會話管理,Shiro框架構(gòu)建了專門的會話管理機(jī)制,Web項(xiàng)目中的會話可以由它代為管理,即使不具備會話管理功能的客戶端項(xiàng)目,Shiro的會話管理功能也可以使用,這使得Shiro用戶在會話管理層面無需關(guān)心是何種類型的項(xiàng)目,這也是Shiro框架易用性的重要體現(xiàn)。
4)加密(Cryptography),權(quán)限系統(tǒng)中數(shù)據(jù)加密是必不可少的內(nèi)容,Shiro試圖簡化加密和解密操作,它引入了CipherService API,讓用戶只需提供密鑰就可以根據(jù)需要進(jìn)行加密和解密。此外,Shiro封裝了諸如md5和sha等常用的加密算法,方便用戶進(jìn)行調(diào)用。
5)其他功能,除了核心功能外,Shiro還提供了幾項(xiàng)非常實(shí)用的特征,包括Web支持、緩存功能、多線程并發(fā)驗(yàn)證、測試工具等。
2.2 構(gòu)建權(quán)限框架
Shiro框架是RBAC模型,而且是細(xì)粒度權(quán)限管理,其構(gòu)建的基礎(chǔ)是權(quán)限點(diǎn),角色和用戶等權(quán)限數(shù)據(jù)都是基于權(quán)限點(diǎn)進(jìn)行建立。用戶可以通過重寫AuthorizingRealm類和修改配置文件實(shí)現(xiàn)Shiro框架服務(wù)于業(yè)務(wù)系統(tǒng),以下是具體構(gòu)建的流程:
1)定義權(quán)限數(shù)據(jù)
權(quán)限數(shù)據(jù)通常與被存儲在數(shù)據(jù)庫中,也可以用其他的形式存儲。在具體建立時(shí)通常需要構(gòu)建權(quán)限點(diǎn)數(shù)據(jù)、角色數(shù)據(jù)和用戶數(shù)據(jù),權(quán)限點(diǎn)數(shù)據(jù)和角色數(shù)據(jù)是多對多關(guān)系,角色數(shù)據(jù)和用戶數(shù)據(jù)也是多對多關(guān)系,權(quán)限點(diǎn)數(shù)據(jù)最為核心的內(nèi)容是權(quán)限字符串,通常形式是“fjqx:zjqx”,冒號前代表父級權(quán)限,后面是子集權(quán)限,無論是在頁面還是在程序代碼中,都是通過這個(gè)串標(biāo)識系統(tǒng)功能,這個(gè)串對應(yīng)的權(quán)限點(diǎn)被賦予了哪個(gè)用戶,哪個(gè)用戶才擁有訪問這個(gè)系統(tǒng)功能的權(quán)限。
2)配置Shiro過濾器
以Web開發(fā)為例,Shiro權(quán)限框架的基礎(chǔ)是過濾器,過濾器根據(jù)認(rèn)證和授權(quán)的設(shè)定,決定用戶訪問系統(tǒng)的權(quán)限,Shiro提供IniShiroFilter類完成這項(xiàng)工作。由于Shiro提供了對于Spring和Struts等框架的支持,所以針對于不同類型的框架,過濾器配置有一定的差異。
3)繼承AuthorizingRealm類
繼承AuthroizedingRealm類,重寫“doGetAuthorizationInfo”和“doGetAuthenticationInfo”方法是Shiro開發(fā)的核心,通過對這兩個(gè)方法的重寫,用戶可以根據(jù)自己業(yè)務(wù)的實(shí)際情況編寫認(rèn)證和授權(quán)功能。例如:用戶數(shù)據(jù)和授權(quán)數(shù)據(jù)如果存儲在數(shù)據(jù)庫中,這兩個(gè)方法中就可以讀取數(shù)據(jù)庫,完成認(rèn)證和授權(quán)的編寫。
4)URL配置
URL配置可以設(shè)定系統(tǒng)URL認(rèn)證路由情況和訪問權(quán)限,通過配置“l(fā)oginURL”、“successURL”、“unauthorizedUrl”等參數(shù)決定系統(tǒng)認(rèn)證入口、認(rèn)證成功和認(rèn)證失敗的URL流向。通過給系統(tǒng)URL設(shè)定”authc”、“anon”、“l(fā)ogout”等值,確定哪些URL需要認(rèn)證才可以訪問,哪些路徑可以匿名訪問,哪些路徑是注銷鏈接。
2.3 Shiro的實(shí)際應(yīng)用
1)用戶認(rèn)證
用戶認(rèn)證和傳統(tǒng)的用戶登錄有一定的差別,首先需要利用Shiro提供的UsernamePasswordToken類和輸入的用戶名驗(yàn)證信息構(gòu)建認(rèn)證令牌,然后使用Subject類的login方法進(jìn)行令牌的驗(yàn)證,從而判定登錄是否成功。
2)授權(quán)的應(yīng)用
授權(quán)的應(yīng)用主要體現(xiàn)在三個(gè)方面:一是URL控制;二是頁面級元素的控制;三是代碼級權(quán)限控制。URL通過配置文件決定訪問的方式和權(quán)限,頁面級元素和代碼級權(quán)限控制主要通過權(quán)限字符串,在Web開發(fā),可以通過標(biāo)簽的方式在頁面中進(jìn)行HTML元素的控制,代碼級權(quán)限可以通過isPermitted(權(quán)限字符串)、isRole(角色字符串)等方法進(jìn)行權(quán)限控制。
3 結(jié)束語
Shiro權(quán)限框架是開源的,它提供了簡潔和實(shí)用的權(quán)限管理功能,它在用戶界面、訪問路徑和代碼層面都提供了訪問控制,能夠做到真正安全的訪問控制。Shiro所有的技術(shù)都是圍繞認(rèn)證和授權(quán)這兩個(gè)核心,根據(jù)系統(tǒng)的需要可以重寫認(rèn)證和授權(quán),這提供給用戶更加靈活的權(quán)限管理。但是,項(xiàng)目的需求通常會非常復(fù)雜,Shiro在具體應(yīng)用的時(shí)候還需要根據(jù)項(xiàng)目的實(shí)際需求對Shiro源代碼進(jìn)行相應(yīng)的調(diào)整,再結(jié)合Shiro的特點(diǎn)完成具體任務(wù)。
參考文獻(xiàn):
[1] 黃經(jīng)贏.基于Shiro框架的細(xì)粒度權(quán)限控制系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].廣東技術(shù)師范學(xué)院學(xué)報(bào):自然科學(xué),2013(7):20-23.
[2] 楊運(yùn)平, 吳智俊.Apache Shiro安全框架在技術(shù)轉(zhuǎn)移服務(wù)系統(tǒng)中的應(yīng)用[J].計(jì)算機(jī)與現(xiàn)代化,2014(3):157-160.
[3] 梁云娟.使用SpringSecurity開發(fā)安全的Java程序[J].河南師范大學(xué)學(xué)報(bào):自然科學(xué)版,2012,4(40):148-150.