摘 要: 針對開源安全框架Spring Security的Web資源保護功能進行研究,,分析框架的認證和授權(quán)兩個主要過程,指出了框架對于用戶和Web資源的授權(quán)信息外化存儲這一關(guān)鍵企業(yè)級安全特性支持上的不足,進而對此進行了擴展,。借助于Spring容器的依賴注入特性和安全框架的擴展性,,結(jié)合數(shù)據(jù)庫存儲授權(quán)信息,本文設(shè)計了一個基于Spring Security的用戶與Web資源授權(quán)信息動態(tài)存儲方案,,并給出了關(guān)鍵的程序代碼,。
關(guān)鍵詞: 安全框架;訪問控制,;用戶認證,;資源授權(quán)
0 引言
權(quán)限管理是Web應(yīng)用系統(tǒng)最重要的組成部分之一,擔(dān)負著用戶分級分類管理,、系統(tǒng)和數(shù)據(jù)的訪問控制等重要職責(zé)[1],。在B/S架構(gòu)中主要體現(xiàn)在對系統(tǒng)的Web資源的保護。盡管Servlet規(guī)范定義了安全性接口,,但因依賴應(yīng)用服務(wù)器的具體實現(xiàn),,使用這種安全服務(wù)的應(yīng)用可移植性較差。而且Servlet規(guī)范對于很多常用的企業(yè)級安全特性并未作出規(guī)定,,使得多數(shù)應(yīng)用服務(wù)器對這些特性不予支持,。企業(yè)應(yīng)用開發(fā)急需一種能夠保障應(yīng)用可移植性強、廣泛支持企業(yè)級安全特性的安全解決方案,。
Spring Security[2]正是為解決上述難題而建立的開源安全框架,。借助于過濾器技術(shù)和Spring框架,應(yīng)用的可移植性得到了保證,。這一框架還為應(yīng)用提供了常用的企業(yè)級安全特性,,比如用戶切換,、并發(fā)Session控制、領(lǐng)域?qū)ο蟮氖跈?quán)支持等[3],。盡管這是一個擴展性極好的安全框架,,但是對授權(quán)信息的外化存儲[3](將授權(quán)信息存儲到數(shù)據(jù)庫中或者磁盤文件等外部環(huán)境)這一關(guān)鍵企業(yè)級安全特性的支持很不完善。針對這一問題,,本文通過研究框架的Web資源保護機制,,通過自定義框架接口實現(xiàn)替代系統(tǒng)默認組件的方式,實現(xiàn)了一個動態(tài)權(quán)限設(shè)計方案,。
1 Web資源保護機制
Spring Security借助一系列Servlet過濾器為目標資源提供安全性增強[4],,但并不需要在Web容器的配置文件中定義很多過濾器,而是借助于安全框架提供的代理過濾器將請求委托給IoC容器中配置的安全過濾器鏈來處理,,使得過濾器鏈中的過濾器可以享受到依賴注入[5]服務(wù),,而且減少了框架與Web環(huán)境的耦合性。
Web資源[6]是指能夠通過URL訪問到的一切資源,。對Web資源的保護是基于Web的企業(yè)級應(yīng)用最主要的安全需求,。Spring Security框架通過過濾器技術(shù)對Web資源進行保護,包括認證和授權(quán)兩個主要過程,。
認證[7]是驗證一個用戶與其聲明身份是否相符的過程,,用戶必須提供憑證,通常是密碼,。用戶在訪問目標資源前,,框架必須攔截到請求,作出認證處理,。比如收集用戶憑證,、確認用戶身份。在完成認證后,,框架必須管理好認證結(jié)果,,以供用戶后續(xù)訪問使用,避免重復(fù)認證,。如果通過認證,,則生成封裝該用戶授權(quán)信息的Authentication認證對象供授權(quán)使用。如果未通過認證,,則返回登錄頁面,。
授權(quán)[7]是控制對受保護資源的訪問的過程,必須在認證之后進行,。當(dāng)已認證用戶訪問受保護資源時,,授權(quán)過程根據(jù)用戶的認證對象和受保護資源的訪問屬性判斷是否允許用戶訪問這個資源。如果授權(quán)被通過,,則執(zhí)行目標資源,;否則執(zhí)行拒絕訪問頁面,。如果未認證用戶通過直接輸入URL訪問受保護的資源,則會重定向到登錄頁面,。
2 認證與授權(quán)分析
2.1 認證過程分析
當(dāng)用戶在登錄頁面提交包含用戶名和密碼的請求時,,認證過濾器[8]會截獲并處理這個請求,認證過程開始:
?。?)認證過濾器從請求中獲取用戶名和密碼封裝成認證對象[9],然后將其交給配置的認證管理器來完成認證工作,。如果完成認證,,則返回到認證過濾器中,接著執(zhí)行安全過濾器鏈的下一步,。
?。?)認證管理器通過認證提供器完成具體的認證操作。認證提供器提供保存在服務(wù)器端的用戶信息,。認證管理器持有一組認證提供器,,按順序遍歷配置的認證提供器。如果某個認證提供器成功認證,,則認證結(jié)果封裝到認證對象中,,供授權(quán)使用。其他認證提供器便沒有機會再去完成本次認證請求,。
?。?)認證提供器處理用戶認證請求的基本過程包括:從緩存或數(shù)據(jù)庫中獲取用戶信息對象,判斷用戶狀態(tài)(是否鎖定,、是否有效,、帳號是否過期),啟動用戶輸入信息與服務(wù)器端存儲的用戶信息的對比,。如果對比操作正常完成,,則表示通過認證,返回認證管理器,,再返回認證過濾器,。如果對比操作拋出異常,則表明認證失敗,,這一異常將上拋至認證過濾器處理,,處理的結(jié)果是轉(zhuǎn)到認證失敗頁面。
通過認證提供器,,應(yīng)用與認證信息解耦,,一切差異都只存在于框架配置文件的元數(shù)據(jù)中,甚至可以把認證信息轉(zhuǎn)移到數(shù)據(jù)庫或者目錄服務(wù)器中實現(xiàn)動態(tài)存儲,,這樣認證信息的修改就無需重啟應(yīng)用了,,這正是企業(yè)級應(yīng)用的安全需求,。
2.2 授權(quán)過程分析
當(dāng)用戶請求受保護資源時,授權(quán)過濾器要判斷是否允許用戶訪問受保護資源,。整個授權(quán)過程分為如下步驟:(1)授權(quán)過濾器攔截請求,,經(jīng)過預(yù)處理后,如果滿足條件,,則進入“事前評估”過程,,即訪問資源前的安全檢查。(2)如果完成“事前評估”,,則表示可以訪問目標資源,,接著執(zhí)行安全過濾器鏈的下一步。(3)如果“事前評估”過程發(fā)生異常,,則表示不能訪問目標資源,。此時安全過濾器鏈中異常轉(zhuǎn)換過濾器將捕獲并處理異常,或者轉(zhuǎn)向訪問拒絕頁面(用戶權(quán)限不足),,或者轉(zhuǎn)向登錄頁面(用戶未認證),。
“事前評估”是授權(quán)過程的關(guān)鍵,其操作封裝在授權(quán)過濾器父類的beforeInvocation方法中,,步驟總結(jié)如下:
?。?)獲取目標資源的授權(quán)信息。如果目標資源受到保護,,則返回封裝了目標資源和授權(quán)信息的ConfigAttributeDefinition對象,。如果目標資源不受保護,則返回null,,退出“事前評估”,。
(2)獲得當(dāng)前用戶的認證對象,。如果認證對象處于未認證狀態(tài),,則認證管理器介入,啟動認證流程,。若在認證過程中產(chǎn)生異常,,則返回登錄頁面給用戶。如果認證對象處于已認證狀態(tài),,則進入授權(quán)階段,。
(3)進入授權(quán)階段,,授權(quán)管理器通過引用的幾個授權(quán)投票器實施具體授權(quán)操作,。
(4)如果授權(quán)成功,,則進入安全過濾器鏈的下一步驟,,通常是調(diào)用目標資源,。如果授權(quán)失敗,則拋出授權(quán)異常,,被異常轉(zhuǎn)換過濾器捕捉處理,,返回給用戶訪問拒絕頁面。
授權(quán)過濾器通過ObjectDefinitionSource接口獲取配置文件中的資源授權(quán)信息,。企業(yè)級應(yīng)用通常將資源授權(quán)信息存儲到RDBMS或者目錄服務(wù)器中,,實現(xiàn)動態(tài)調(diào)整應(yīng)用的資源授權(quán)信息的目的。Spring Security沒有對這一企業(yè)特性給出直接支持,,但框架是基于IoC容器組織各種組件,,因此可以自定義資源授權(quán)接口的實現(xiàn)類并進行擴展。
3 動態(tài)存儲授權(quán)信息研究
3.1 默認的授權(quán)信息存儲方式
Spring Security默認存儲授權(quán)信息的方式是直接寫在配置文件中,。這種做法僅僅適合演示或者小型應(yīng)用,會帶來以下幾個問題:首先,,配置文件代碼急劇膨脹,,難以維護。其次,,無法實現(xiàn)授權(quán)信息的動態(tài)存儲,。因為配置文件只在應(yīng)用啟動時被加載到內(nèi)存中,每次修改配置文件都需要重新加載應(yīng)用才能生效,。企業(yè)級應(yīng)用都要求能夠動態(tài)授權(quán)信息,。通常做法是把授權(quán)信息存儲在數(shù)據(jù)庫、目錄服務(wù)器或者磁盤文件上,,使用程序進行增刪改查操作,。但框架對授權(quán)信息的外化存儲支持并不完善,需要自行擴展,。
3.2 動態(tài)存儲授權(quán)信息方式的配置
對于用戶授權(quán)信息的外化存儲,,框架給出了較好的支持,通過配置<jdbc-user-service>元素,,指定自定義數(shù)據(jù)表以及提取用戶授權(quán)信息的SQL語句,,這里不再詳細討論。對于資源授權(quán)信息的外化存儲,,框架沒有提供支持方法,,也沒有留下擴展接口。不過,,框架提供了調(diào)整安全過濾器鏈的功能,,以及基于IoC容器管理組件的方式,從而能夠用自定義組件替換默認實現(xiàn),,進行功能擴展,。首先,,自定義用戶表、資源表,、角色表以及相關(guān)映射表,,如圖1所示。其次,,配置資源授權(quán)接口的自定義實現(xiàn)類,,同時為其提供定制的提取資源授權(quán)信息的SQL語句。再次,,配置授權(quán)過濾器Bean,,將資源授權(quán)接口的自定義實現(xiàn)類配置到授權(quán)過濾器的objectDefinitionSource屬性中,并利用框架提供的調(diào)整過濾器鏈功能標簽 <custom-filter>將配置的授權(quán)過濾器Bean放到安全過濾器鏈的默認授權(quán)過濾器之前,,使得默認授權(quán)過濾器不再執(zhí)行授權(quán)操作,。
3.3 資源授權(quán)接口實現(xiàn)
當(dāng)Web容器裝載應(yīng)用時,spring會自動解析配置文件中的資源授權(quán)信息,,按特定格式生成默認的資源授權(quán)實現(xiàn)類,。對于采用數(shù)據(jù)庫存儲資源授權(quán)信息的應(yīng)用,必須自行將資源授權(quán)信息從數(shù)據(jù)庫中取出并按照特定格式存儲到資源授權(quán)接口實現(xiàn)對象中,,并將此對象設(shè)置到授權(quán)過濾器的屬性中,。通過實現(xiàn)FactoryBean接口并且繼承JdbcDaoSupport的自定義類來提供資源授權(quán)對象。其中關(guān)鍵是buildRequestMap()方法調(diào)用findResources()方法從數(shù)據(jù)庫中獲取資源授權(quán)信息,,組裝成特定格式,,實現(xiàn)代碼如圖2和圖3所示。其中findResources()方法通過內(nèi)部類ResourceMapping的execute()方法利用spring JDBC技術(shù)完成數(shù)據(jù)存取操作,。
4 結(jié)束語
Spring Security安全框架通過過濾器技術(shù),,為應(yīng)用提供了強大的Web資源保護機制,安全命名空間更是進一步簡化了配置代碼,,但默認組件并不支持授權(quán)信息的外化存儲,。本文對框架的認證與授權(quán)流程及原理進行了研究,在此基礎(chǔ)上對用戶授權(quán)信息和資源授權(quán)信息的外化存儲進行了設(shè)計,,這種方案符合企業(yè)級應(yīng)用對于授權(quán)信息的動態(tài)存儲,,對于應(yīng)用的權(quán)限設(shè)計方案具有一定的參考價值和實用性。
參考文獻
[1] 信科,,楊峰,,楊光旭,等.基于RBAC權(quán)限管理系統(tǒng)的優(yōu)化設(shè)計與實現(xiàn)[J].計算機技術(shù)與發(fā)展,,2011(7):172-174,,249.
[2] CRAIG W.Spring實戰(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] 周秀,,劉培順,,劉加標,等.海洋環(huán)境云平臺訪問控制系統(tǒng)研究[J].微型機與應(yīng)用,,2015,,34(7):9-12,23.
[7] 路鵬,,殷兆麟.基于Spring的Acegi安全框架認證與授權(quán)的分析及擴展[J].計算機工程與設(shè)計,,2007(6):1313-1316.
[8] 許軍林,蔣年德.Acegi安全框架在Web系統(tǒng)中的應(yīng)用[J].現(xiàn)代計算機(專業(yè)版),,2007(9):25-26,57.
[9] 黎小紅.基于Spring框架應(yīng)用的權(quán)限控制系統(tǒng)的研究和實現(xiàn)[J].計算機與信息技術(shù),,2006(11):4-7.