賽序朋,侯瑞春,丁香乾
(1.中國海洋大學(xué) 信息科學(xué)與工程學(xué)院,山東 青島 266100;2.中國海洋大學(xué) 信息工程中心,山東 青島 266071)
Spring Security的Web資源保護(hù)功能研究與擴(kuò)展*
賽序朋1,侯瑞春2,丁香乾2
(1.中國海洋大學(xué)信息科學(xué)與工程學(xué)院,山東青島266100;
2.中國海洋大學(xué)信息工程中心,山東青島266071)
針對開源安全框架Spring Security的Web資源保護(hù)功能進(jìn)行研究,分析框架的認(rèn)證和授權(quán)兩個主要過程,指出了框架對于用戶和Web資源的授權(quán)信息外化存儲這一關(guān)鍵企業(yè)級安全特性支持上的不足,進(jìn)而對此進(jìn)行了擴(kuò)展。借助于Spring容器的依賴注入特性和安全框架的擴(kuò)展性,結(jié)合數(shù)據(jù)庫存儲授權(quán)信息,本文設(shè)計了一個基于Spring Security的用戶與Web資源授權(quán)信息動態(tài)存儲方案,并給出了關(guān)鍵的程序代碼。
安全框架;訪問控制;用戶認(rèn)證;資源授權(quán)
權(quán)限管理是Web應(yīng)用系統(tǒng)最重要的組成部分之一,擔(dān)負(fù)著用戶分級分類管理、系統(tǒng)和數(shù)據(jù)的訪問控制等重要職責(zé)[1]。在B/S架構(gòu)中主要體現(xiàn)在對系統(tǒng)的Web資源的保護(hù)。盡管Servlet規(guī)范定義了安全性接口,但因依賴應(yīng)用服務(wù)器的具體實(shí)現(xiàn),使用這種安全服務(wù)的應(yīng)用可移植性較差。而且Servlet規(guī)范對于很多常用的企業(yè)級安全特性并未作出規(guī)定,使得多數(shù)應(yīng)用服務(wù)器對這些特性不予支持。企業(yè)應(yīng)用開發(fā)急需一種能夠保障應(yīng)用可移植性強(qiáng)、廣泛支持企業(yè)級安全特性的安全解決方案。
Spring Security[2]正是為解決上述難題而建立的開源安全框架。借助于過濾器技術(shù)和 Spring框架,應(yīng)用的可移植性得到了保證。這一框架還為應(yīng)用提供了常用的企業(yè)級安全特性,比如用戶切換、并發(fā) Session控制、領(lǐng)域?qū)ο蟮氖跈?quán)支持等[3]。盡管這是一個擴(kuò)展性極好的安全框架,但是對授權(quán)信息的外化存儲[3](將授權(quán)信息存儲到數(shù)據(jù)庫中或者磁盤文件等外部環(huán)境)這一關(guān)鍵企業(yè)級安全特性的支持很不完善。針對這一問題,本文通過研究框架的Web資源保護(hù)機(jī)制,通過自定義框架接口實(shí)現(xiàn)替代系統(tǒng)默認(rèn)組件的方式,實(shí)現(xiàn)了一個動態(tài)權(quán)限設(shè)計方案。
Spring Security借助一系列Servlet過濾器為目標(biāo)資源提供安全性增強(qiáng)[4],但并不需要在Web容器的配置文件中定義很多過濾器,而是借助于安全框架提供的代理過濾器將請求委托給IoC容器中配置的安全過濾器鏈來處理,使得過濾器鏈中的過濾器可以享受到依賴注入[5]服務(wù),而且減少了框架與Web環(huán)境的耦合性。
Web資源[6]是指能夠通過URL訪問到的一切資源。對Web資源的保護(hù)是基于Web的企業(yè)級應(yīng)用最主要的安全需求。Spring Security框架通過過濾器技術(shù)對Web資源進(jìn)行保護(hù),包括認(rèn)證和授權(quán)兩個主要過程。
認(rèn)證[7]是驗(yàn)證一個用戶與其聲明身份是否相符的過程,用戶必須提供憑證,通常是密碼。用戶在訪問目標(biāo)資源前,框架必須攔截到請求,作出認(rèn)證處理。比如收集用戶憑證、確認(rèn)用戶身份。在完成認(rèn)證后,框架必須管理好認(rèn)證結(jié)果,以供用戶后續(xù)訪問使用,避免重復(fù)認(rèn)證。如果通過認(rèn)證,則生成封裝該用戶授權(quán)信息的Authentication認(rèn)證對象供授權(quán)使用。如果未通過認(rèn)證,則返回登錄頁面。
授權(quán)[7]是控制對受保護(hù)資源的訪問的過程,必須在認(rèn)證之后進(jìn)行。當(dāng)已認(rèn)證用戶訪問受保護(hù)資源時,授權(quán)過程根據(jù)用戶的認(rèn)證對象和受保護(hù)資源的訪問屬性判斷是否允許用戶訪問這個資源。如果授權(quán)被通過,則執(zhí)行目標(biāo)資源;否則執(zhí)行拒絕訪問頁面。如果未認(rèn)證用戶通過直接輸入URL訪問受保護(hù)的資源,則會重定向到登錄頁面。
2.1認(rèn)證過程分析
當(dāng)用戶在登錄頁面提交包含用戶名和密碼的請求時,認(rèn)證過濾器[8]會截獲并處理這個請求,認(rèn)證過程開始:
(1)認(rèn)證過濾器從請求中獲取用戶名和密碼封裝成認(rèn)證對象[9],然后將其交給配置的認(rèn)證管理器來完成認(rèn)證工作。如果完成認(rèn)證,則返回到認(rèn)證過濾器中,接著執(zhí)行安全過濾器鏈的下一步。
(2)認(rèn)證管理器通過認(rèn)證提供器完成具體的認(rèn)證操作。認(rèn)證提供器提供保存在服務(wù)器端的用戶信息。認(rèn)證管理器持有一組認(rèn)證提供器,按順序遍歷配置的認(rèn)證提供器。如果某個認(rèn)證提供器成功認(rèn)證,則認(rèn)證結(jié)果封裝到認(rèn)證對象中,供授權(quán)使用。其他認(rèn)證提供器便沒有機(jī)會再去完成本次認(rèn)證請求。
(3)認(rèn)證提供器處理用戶認(rèn)證請求的基本過程包括:從緩存或數(shù)據(jù)庫中獲取用戶信息對象,判斷用戶狀態(tài)(是否鎖定、是否有效、帳號是否過期),啟動用戶輸入信息與服務(wù)器端存儲的用戶信息的對比。如果對比操作正常完成,則表示通過認(rèn)證,返回認(rèn)證管理器,再返回認(rèn)證過濾器。如果對比操作拋出異常,則表明認(rèn)證失敗,這一異常將上拋至認(rèn)證過濾器處理,處理的結(jié)果是轉(zhuǎn)到認(rèn)證失敗頁面。
通過認(rèn)證提供器,應(yīng)用與認(rèn)證信息解耦,一切差異都只存在于框架配置文件的元數(shù)據(jù)中,甚至可以把認(rèn)證信息轉(zhuǎn)移到數(shù)據(jù)庫或者目錄服務(wù)器中實(shí)現(xiàn)動態(tài)存儲,這樣認(rèn)證信息的修改就無需重啟應(yīng)用了,這正是企業(yè)級應(yīng)用的安全需求。
2.2授權(quán)過程分析
當(dāng)用戶請求受保護(hù)資源時,授權(quán)過濾器要判斷是否允許用戶訪問受保護(hù)資源。整個授權(quán)過程分為如下步驟:(1)授權(quán)過濾器攔截請求,經(jīng)過預(yù)處理后,如果滿足條件,則進(jìn)入“事前評估”過程,即訪問資源前的安全檢查。(2)如果完成“事前評估”,則表示可以訪問目標(biāo)資源,接著執(zhí)行安全過濾器鏈的下一步。(3)如果“事前評估”過程發(fā)生異常,則表示不能訪問目標(biāo)資源。此時安全過濾器鏈中異常轉(zhuǎn)換過濾器將捕獲并處理異常,或者轉(zhuǎn)向訪問拒絕頁面 (用戶權(quán)限不足),或者轉(zhuǎn)向登錄頁面(用戶未認(rèn)證)。
“事前評估”是授權(quán)過程的關(guān)鍵,其操作封裝在授權(quán)過濾器父類的beforeInvocation方法中,步驟總結(jié)如下:
(1)獲取目標(biāo)資源的授權(quán)信息。如果目標(biāo)資源受到保護(hù),則返回封裝了目標(biāo)資源和授權(quán)信息的ConfigAttributeDefinition對象。如果目標(biāo)資源不受保護(hù),則返回null,退出“事前評估”。
(2)獲得當(dāng)前用戶的認(rèn)證對象。如果認(rèn)證對象處于未認(rèn)證狀態(tài),則認(rèn)證管理器介入,啟動認(rèn)證流程。若在認(rèn)證過程中產(chǎn)生異常,則返回登錄頁面給用戶。如果認(rèn)證對象處于已認(rèn)證狀態(tài),則進(jìn)入授權(quán)階段。
(3)進(jìn)入授權(quán)階段,授權(quán)管理器通過引用的幾個授權(quán)投票器實(shí)施具體授權(quán)操作。
(4)如果授權(quán)成功,則進(jìn)入安全過濾器鏈的下一步驟,通常是調(diào)用目標(biāo)資源。如果授權(quán)失敗,則拋出授權(quán)異常,被異常轉(zhuǎn)換過濾器捕捉處理,返回給用戶訪問拒絕頁面。
授權(quán)過濾器通過 ObjectDefinitionSource接口獲取配置文件中的資源授權(quán)信息。企業(yè)級應(yīng)用通常將資源授權(quán)信息存儲到RDBMS或者目錄服務(wù)器中,實(shí)現(xiàn)動態(tài)調(diào)整應(yīng)用的資源授權(quán)信息的目的。Spring Security沒有對這一企業(yè)特性給出直接支持,但框架是基于IoC容器組織各種組件,因此可以自定義資源授權(quán)接口的實(shí)現(xiàn)類并進(jìn)行擴(kuò)展。
3.1默認(rèn)的授權(quán)信息存儲方式
Spring Security默認(rèn)存儲授權(quán)信息的方式是直接寫在配置文件中。這種做法僅僅適合演示或者小型應(yīng)用,會帶來以下幾個問題:首先,配置文件代碼急劇膨脹,難以維護(hù)。其次,無法實(shí)現(xiàn)授權(quán)信息的動態(tài)存儲。因?yàn)榕渲梦募辉趹?yīng)用啟動時被加載到內(nèi)存中,每次修改配置文件都需要重新加載應(yīng)用才能生效。企業(yè)級應(yīng)用都要求能夠動態(tài)授權(quán)信息。通常做法是把授權(quán)信息存儲在數(shù)據(jù)庫、目錄服務(wù)器或者磁盤文件上,使用程序進(jìn)行增刪改查操作。但框架對授權(quán)信息的外化存儲支持并不完善,需要自行擴(kuò)展。
3.2動態(tài)存儲授權(quán)信息方式的配置
對于用戶授權(quán)信息的外化存儲,框架給出了較好的支持,通過配置<jdbc-user-service〉元素,指定自定義數(shù)據(jù)表以及提取用戶授權(quán)信息的SQL語句,這里不再詳細(xì)討論。對于資源授權(quán)信息的外化存儲,框架沒有提供支持方法,也沒有留下擴(kuò)展接口。不過,框架提供了調(diào)整安全過濾器鏈的功能,以及基于IoC容器管理組件的方式,從而能夠用自定義組件替換默認(rèn)實(shí)現(xiàn),進(jìn)行功能擴(kuò)展。首先,自定義用戶表、資源表、角色表以及相關(guān)映射表,如圖1所示。其次,配置資源授權(quán)接口的自定義實(shí)現(xiàn)類,同時為其提供定制的提取資源授權(quán)信息的SQL語句。再次,配置授權(quán)過濾器 Bean,將資源授權(quán)接口的自定義實(shí)現(xiàn)類配置到授權(quán)過濾器的 objectDefinitionSource屬性中,并利用框架提供的調(diào)整過濾器鏈功能標(biāo)簽<custom-filter〉將配置的授權(quán)過濾器Bean放到安全過濾器鏈的默認(rèn)授權(quán)過濾器之前,使得默認(rèn)授權(quán)過濾器不再執(zhí)行授權(quán)操作。
圖1 自定義數(shù)據(jù)表
3.3資源授權(quán)接口實(shí)現(xiàn)
當(dāng)Web容器裝載應(yīng)用時,spring會自動解析配置文件中的資源授權(quán)信息,按特定格式生成默認(rèn)的資源授權(quán)實(shí)現(xiàn)類。對于采用數(shù)據(jù)庫存儲資源授權(quán)信息的應(yīng)用,必須自行將資源授權(quán)信息從數(shù)據(jù)庫中取出并按照特定格式存儲到資源授權(quán)接口實(shí)現(xiàn)對象中,并將此對象設(shè)置到授權(quán)過濾器的屬性中。通過實(shí)現(xiàn)FactoryBean接口并且繼承JdbcDaoSupport的自定義類來提供資源授權(quán)對象。其中關(guān)鍵是 buildRequestMap()方法調(diào)用 findResources()方法從數(shù)據(jù)庫中獲取資源授權(quán)信息,組裝成特定格式,實(shí)現(xiàn)代碼如圖2和圖3所示。其中findResources()方法通過內(nèi)部類ResourceMapping的execute()方法利用spring JDBC技術(shù)完成數(shù)據(jù)存取操作。
Spring Security安全框架通過過濾器技術(shù),為應(yīng)用提供了強(qiáng)大的Web資源保護(hù)機(jī)制,安全命名空間更是進(jìn)一步簡化了配置代碼,但默認(rèn)組件并不支持授權(quán)信息的外化存儲。本文對框架的認(rèn)證與授權(quán)流程及原理進(jìn)行了研究,在此基礎(chǔ)上對用戶授權(quán)信息和資源授權(quán)信息的外化存儲進(jìn)行了設(shè)計,這種方案符合企業(yè)級應(yīng)用對于授權(quán)信息的動態(tài)存儲,對于應(yīng)用的權(quán)限設(shè)計方案具有一定的參考價值和實(shí)用性。
圖2 組裝授權(quán)信息
圖3 從數(shù)據(jù)庫獲取資源授權(quán)信息
[1]信科,楊峰,楊光旭,等.基于RBAC權(quán)限管理系統(tǒng)的優(yōu)化設(shè)計與實(shí)現(xiàn)[J].計算機(jī)技術(shù)與發(fā)展,2011(7):172-174,249.
[2]CRAIG W.Spring實(shí)戰(zhàn)[M].耿淵,譯.北京:人民郵電出版社,2011.
[3]羅時飛.敏捷Acegi、CAS[M].北京:電子工業(yè)出版社,2005.
[4]MAK G,LONG J,RUBIO D.Spring攻略[M].陳宗恒,姚軍,蔣亮,譯.北京:人民郵電出版社,2011.
[5]羅時飛.精通 Spring—深入JavaEE開發(fā)核心技術(shù)[M].北京:電子工業(yè)出版社,2008.
[6]周秀,劉培順,劉加標(biāo),等.海洋環(huán)境云平臺訪問控制系統(tǒng)研究[J].微型機(jī)與應(yīng)用,2015,34(7):9-12,23.
[7]路鵬,殷兆麟.基于 Spring的 Acegi安全框架認(rèn)證與授權(quán)的分析及擴(kuò)展[J].計算機(jī)工程與設(shè)計,2007(6):1313-1316.
[8]許軍林,蔣年德.Acegi安全框架在Web系統(tǒng)中的應(yīng)用[J].現(xiàn)代計算機(jī)(專業(yè)版),2007(9):25-26,57.
[9]黎小紅.基于 Spring框架應(yīng)用的權(quán)限控制系統(tǒng)的研究和實(shí)現(xiàn)[J].計算機(jī)與信息技術(shù),2006(11):4-7.
Research and extension of Web resource protection function of Spring Security
Sai Xupeng1,Hou Ruichun2,Ding Xiangqian2
(1.Information Science and Engineering Institute,Ocean University of China,Qingdao 266100,China;
2.Center of Information Engineering,Ocean University of China,Qingdao 266071,China)
Aiming at the protection function of Web resource of Spring Security framework,this paper analyzes the two main process of authentication and authorization,points out the framework being short of supporting the external storage of user and Web resource′s authorization information,which is a key enterprise security character,and then carrys on the patulous research aiming at the shortcoming.Using the character of dependence injection of Spring container and the expansibility of Spring Security,combining with storing the authorization information in the database,this paper designs a dynamic storage solution of user and Web resource authorization information,and completes the main programming of core class.
security framework;access control;user authentication;resource authorization
TP311
A
1674-7720(2015)15-0005-03
賽序朋,侯瑞春,丁香乾.Spring Security的 Web資源保護(hù)功能研究與擴(kuò)展[J].微型機(jī)與應(yīng)用,2015,34(15):5-7.
2015-04-14)
賽序朋(1986-),通信作者,男,碩士研究生,主要研究方向:現(xiàn)代軟件工程學(xué)、Web應(yīng)用系統(tǒng)。E-mail:185467683@qq.com。
侯瑞春(1963-),女,研究生,教授級高級工程師,主要研究方向:計算機(jī)應(yīng)用技術(shù)。
丁香乾(1962-),男,研究生,教授,主要研究方向:計算智能、軟件工程、數(shù)字家庭、制造業(yè)信息化等。
青島市重大專項(xiàng)計劃(13-7-1-ZDZX4-GX);國家科技支撐計劃項(xiàng)目(2012BAF12B06)