《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 通信與網(wǎng)絡(luò) > 設(shè)計(jì)應(yīng)用 > Spring Security的Web資源保護(hù)功能研究與擴(kuò)展
Spring Security的Web資源保護(hù)功能研究與擴(kuò)展
2015年微型機(jī)與應(yīng)用第15期
賽序朋1,,侯瑞春2,丁香乾2
(1.中國(guó)海洋大學(xué) 信息科學(xué)與工程學(xué)院,山東 青島 266100,; 2.中國(guó)海洋大學(xué) 信息工程中心,山東 青島 266071)
摘要: 針對(duì)開源安全框架Spring Security的Web資源保護(hù)功能進(jìn)行研究,,分析框架的認(rèn)證和授權(quán)兩個(gè)主要過(guò)程,,指出了框架對(duì)于用戶和Web資源的授權(quán)信息外化存儲(chǔ)這一關(guān)鍵企業(yè)級(jí)安全特性支持上的不足,進(jìn)而對(duì)此進(jìn)行了擴(kuò)展,。借助于Spring容器的依賴注入特性和安全框架的擴(kuò)展性,,結(jié)合數(shù)據(jù)庫(kù)存儲(chǔ)授權(quán)信息,本文設(shè)計(jì)了一個(gè)基于Spring Security的用戶與Web資源授權(quán)信息動(dòng)態(tài)存儲(chǔ)方案,,并給出了關(guān)鍵的程序代碼,。
Abstract:
Key words :

  摘  要: 針對(duì)開源安全框架Spring Security的Web資源保護(hù)功能進(jìn)行研究,分析框架的認(rèn)證和授權(quán)兩個(gè)主要過(guò)程,,指出了框架對(duì)于用戶和Web資源的授權(quán)信息外化存儲(chǔ)這一關(guān)鍵企業(yè)級(jí)安全特性支持上的不足,,進(jìn)而對(duì)此進(jìn)行了擴(kuò)展。借助于Spring容器的依賴注入特性和安全框架的擴(kuò)展性,,結(jié)合數(shù)據(jù)庫(kù)存儲(chǔ)授權(quán)信息,,本文設(shè)計(jì)了一個(gè)基于Spring Security的用戶與Web資源授權(quán)信息動(dòng)態(tài)存儲(chǔ)方案,并給出了關(guān)鍵的程序代碼,。

  關(guān)鍵詞: 安全框架,;訪問(wèn)控制用戶認(rèn)證,;資源授權(quán)

0 引言

  權(quán)限管理是Web應(yīng)用系統(tǒng)最重要的組成部分之一,,擔(dān)負(fù)著用戶分級(jí)分類管理、系統(tǒng)和數(shù)據(jù)的訪問(wèn)控制等重要職責(zé)[1],。在B/S架構(gòu)中主要體現(xiàn)在對(duì)系統(tǒng)的Web資源的保護(hù),。盡管Servlet規(guī)范定義了安全性接口,,但因依賴應(yīng)用服務(wù)器的具體實(shí)現(xiàn),使用這種安全服務(wù)的應(yīng)用可移植性較差,。而且Servlet規(guī)范對(duì)于很多常用的企業(yè)級(jí)安全特性并未作出規(guī)定,,使得多數(shù)應(yīng)用服務(wù)器對(duì)這些特性不予支持。企業(yè)應(yīng)用開發(fā)急需一種能夠保障應(yīng)用可移植性強(qiáng),、廣泛支持企業(yè)級(jí)安全特性的安全解決方案,。

  Spring Security[2]正是為解決上述難題而建立的開源安全框架。借助于過(guò)濾器技術(shù)和Spring框架,,應(yīng)用的可移植性得到了保證,。這一框架還為應(yīng)用提供了常用的企業(yè)級(jí)安全特性,比如用戶切換,、并發(fā)Session控制,、領(lǐng)域?qū)ο蟮氖跈?quán)支持等[3]。盡管這是一個(gè)擴(kuò)展性極好的安全框架,,但是對(duì)授權(quán)信息的外化存儲(chǔ)[3](將授權(quán)信息存儲(chǔ)到數(shù)據(jù)庫(kù)中或者磁盤文件等外部環(huán)境)這一關(guān)鍵企業(yè)級(jí)安全特性的支持很不完善,。針對(duì)這一問(wèn)題,本文通過(guò)研究框架的Web資源保護(hù)機(jī)制,,通過(guò)自定義框架接口實(shí)現(xiàn)替代系統(tǒng)默認(rèn)組件的方式,,實(shí)現(xiàn)了一個(gè)動(dòng)態(tài)權(quán)限設(shè)計(jì)方案。

1 Web資源保護(hù)機(jī)制

  Spring Security借助一系列Servlet過(guò)濾器為目標(biāo)資源提供安全性增強(qiáng)[4],,但并不需要在Web容器的配置文件中定義很多過(guò)濾器,,而是借助于安全框架提供的代理過(guò)濾器將請(qǐng)求委托給IoC容器中配置的安全過(guò)濾器鏈來(lái)處理,使得過(guò)濾器鏈中的過(guò)濾器可以享受到依賴注入[5]服務(wù),,而且減少了框架與Web環(huán)境的耦合性,。

  Web資源[6]是指能夠通過(guò)URL訪問(wèn)到的一切資源。對(duì)Web資源的保護(hù)是基于Web的企業(yè)級(jí)應(yīng)用最主要的安全需求,。Spring Security框架通過(guò)過(guò)濾器技術(shù)對(duì)Web資源進(jìn)行保護(hù),,包括認(rèn)證和授權(quán)兩個(gè)主要過(guò)程。

  認(rèn)證[7]是驗(yàn)證一個(gè)用戶與其聲明身份是否相符的過(guò)程,,用戶必須提供憑證,,通常是密碼。用戶在訪問(wèn)目標(biāo)資源前,,框架必須攔截到請(qǐng)求,,作出認(rèn)證處理。比如收集用戶憑證,、確認(rèn)用戶身份,。在完成認(rèn)證后,框架必須管理好認(rèn)證結(jié)果,,以供用戶后續(xù)訪問(wèn)使用,,避免重復(fù)認(rèn)證,。如果通過(guò)認(rèn)證,則生成封裝該用戶授權(quán)信息的Authentication認(rèn)證對(duì)象供授權(quán)使用,。如果未通過(guò)認(rèn)證,,則返回登錄頁(yè)面。

  授權(quán)[7]是控制對(duì)受保護(hù)資源的訪問(wèn)的過(guò)程,,必須在認(rèn)證之后進(jìn)行。當(dāng)已認(rèn)證用戶訪問(wèn)受保護(hù)資源時(shí),,授權(quán)過(guò)程根據(jù)用戶的認(rèn)證對(duì)象和受保護(hù)資源的訪問(wèn)屬性判斷是否允許用戶訪問(wèn)這個(gè)資源,。如果授權(quán)被通過(guò),則執(zhí)行目標(biāo)資源,;否則執(zhí)行拒絕訪問(wèn)頁(yè)面,。如果未認(rèn)證用戶通過(guò)直接輸入U(xiǎn)RL訪問(wèn)受保護(hù)的資源,則會(huì)重定向到登錄頁(yè)面,。

2 認(rèn)證與授權(quán)分析

  2.1 認(rèn)證過(guò)程分析

  當(dāng)用戶在登錄頁(yè)面提交包含用戶名和密碼的請(qǐng)求時(shí),,認(rèn)證過(guò)濾器[8]會(huì)截獲并處理這個(gè)請(qǐng)求,認(rèn)證過(guò)程開始:

 ?。?)認(rèn)證過(guò)濾器從請(qǐng)求中獲取用戶名和密碼封裝成認(rèn)證對(duì)象[9],,然后將其交給配置的認(rèn)證管理器來(lái)完成認(rèn)證工作。如果完成認(rèn)證,,則返回到認(rèn)證過(guò)濾器中,,接著執(zhí)行安全過(guò)濾器鏈的下一步。

 ?。?)認(rèn)證管理器通過(guò)認(rèn)證提供器完成具體的認(rèn)證操作,。認(rèn)證提供器提供保存在服務(wù)器端的用戶信息。認(rèn)證管理器持有一組認(rèn)證提供器,,按順序遍歷配置的認(rèn)證提供器,。如果某個(gè)認(rèn)證提供器成功認(rèn)證,則認(rèn)證結(jié)果封裝到認(rèn)證對(duì)象中,,供授權(quán)使用,。其他認(rèn)證提供器便沒有機(jī)會(huì)再去完成本次認(rèn)證請(qǐng)求。

 ?。?)認(rèn)證提供器處理用戶認(rèn)證請(qǐng)求的基本過(guò)程包括:從緩存或數(shù)據(jù)庫(kù)中獲取用戶信息對(duì)象,,判斷用戶狀態(tài)(是否鎖定、是否有效,、帳號(hào)是否過(guò)期),,啟動(dòng)用戶輸入信息與服務(wù)器端存儲(chǔ)的用戶信息的對(duì)比。如果對(duì)比操作正常完成,,則表示通過(guò)認(rèn)證,,返回認(rèn)證管理器,,再返回認(rèn)證過(guò)濾器。如果對(duì)比操作拋出異常,,則表明認(rèn)證失敗,,這一異常將上拋至認(rèn)證過(guò)濾器處理,處理的結(jié)果是轉(zhuǎn)到認(rèn)證失敗頁(yè)面,。

  通過(guò)認(rèn)證提供器,,應(yīng)用與認(rèn)證信息解耦,一切差異都只存在于框架配置文件的元數(shù)據(jù)中,,甚至可以把認(rèn)證信息轉(zhuǎn)移到數(shù)據(jù)庫(kù)或者目錄服務(wù)器中實(shí)現(xiàn)動(dòng)態(tài)存儲(chǔ),,這樣認(rèn)證信息的修改就無(wú)需重啟應(yīng)用了,這正是企業(yè)級(jí)應(yīng)用的安全需求,。

  2.2 授權(quán)過(guò)程分析

  當(dāng)用戶請(qǐng)求受保護(hù)資源時(shí),,授權(quán)過(guò)濾器要判斷是否允許用戶訪問(wèn)受保護(hù)資源。整個(gè)授權(quán)過(guò)程分為如下步驟:(1)授權(quán)過(guò)濾器攔截請(qǐng)求,,經(jīng)過(guò)預(yù)處理后,,如果滿足條件,則進(jìn)入“事前評(píng)估”過(guò)程,,即訪問(wèn)資源前的安全檢查,。(2)如果完成“事前評(píng)估”,則表示可以訪問(wèn)目標(biāo)資源,,接著執(zhí)行安全過(guò)濾器鏈的下一步,。(3)如果“事前評(píng)估”過(guò)程發(fā)生異常,則表示不能訪問(wèn)目標(biāo)資源,。此時(shí)安全過(guò)濾器鏈中異常轉(zhuǎn)換過(guò)濾器將捕獲并處理異常,,或者轉(zhuǎn)向訪問(wèn)拒絕頁(yè)面(用戶權(quán)限不足),或者轉(zhuǎn)向登錄頁(yè)面(用戶未認(rèn)證),。

  “事前評(píng)估”是授權(quán)過(guò)程的關(guān)鍵,,其操作封裝在授權(quán)過(guò)濾器父類的beforeInvocation方法中,步驟總結(jié)如下:

 ?。?)獲取目標(biāo)資源的授權(quán)信息,。如果目標(biāo)資源受到保護(hù),則返回封裝了目標(biāo)資源和授權(quán)信息的ConfigAttributeDefinition對(duì)象,。如果目標(biāo)資源不受保護(hù),,則返回null,退出“事前評(píng)估”,。

 ?。?)獲得當(dāng)前用戶的認(rèn)證對(duì)象。如果認(rèn)證對(duì)象處于未認(rèn)證狀態(tài),,則認(rèn)證管理器介入,,啟動(dòng)認(rèn)證流程,。若在認(rèn)證過(guò)程中產(chǎn)生異常,則返回登錄頁(yè)面給用戶,。如果認(rèn)證對(duì)象處于已認(rèn)證狀態(tài),,則進(jìn)入授權(quán)階段。

 ?。?)進(jìn)入授權(quán)階段,,授權(quán)管理器通過(guò)引用的幾個(gè)授權(quán)投票器實(shí)施具體授權(quán)操作。

 ?。?)如果授權(quán)成功,,則進(jìn)入安全過(guò)濾器鏈的下一步驟,通常是調(diào)用目標(biāo)資源,。如果授權(quán)失敗,則拋出授權(quán)異常,,被異常轉(zhuǎn)換過(guò)濾器捕捉處理,,返回給用戶訪問(wèn)拒絕頁(yè)面。

  授權(quán)過(guò)濾器通過(guò)ObjectDefinitionSource接口獲取配置文件中的資源授權(quán)信息,。企業(yè)級(jí)應(yīng)用通常將資源授權(quán)信息存儲(chǔ)到RDBMS或者目錄服務(wù)器中,,實(shí)現(xiàn)動(dòng)態(tài)調(diào)整應(yīng)用的資源授權(quán)信息的目的。Spring Security沒有對(duì)這一企業(yè)特性給出直接支持,,但框架是基于IoC容器組織各種組件,,因此可以自定義資源授權(quán)接口的實(shí)現(xiàn)類并進(jìn)行擴(kuò)展。

3 動(dòng)態(tài)存儲(chǔ)授權(quán)信息研究

  3.1 默認(rèn)的授權(quán)信息存儲(chǔ)方式

  Spring Security默認(rèn)存儲(chǔ)授權(quán)信息的方式是直接寫在配置文件中,。這種做法僅僅適合演示或者小型應(yīng)用,,會(huì)帶來(lái)以下幾個(gè)問(wèn)題:首先,配置文件代碼急劇膨脹,,難以維護(hù),。其次,無(wú)法實(shí)現(xiàn)授權(quán)信息的動(dòng)態(tài)存儲(chǔ),。因?yàn)榕渲梦募辉趹?yīng)用啟動(dòng)時(shí)被加載到內(nèi)存中,,每次修改配置文件都需要重新加載應(yīng)用才能生效。企業(yè)級(jí)應(yīng)用都要求能夠動(dòng)態(tài)授權(quán)信息,。通常做法是把授權(quán)信息存儲(chǔ)在數(shù)據(jù)庫(kù),、目錄服務(wù)器或者磁盤文件上,使用程序進(jìn)行增刪改查操作,。但框架對(duì)授權(quán)信息的外化存儲(chǔ)支持并不完善,,需要自行擴(kuò)展。

  3.2 動(dòng)態(tài)存儲(chǔ)授權(quán)信息方式的配置

  對(duì)于用戶授權(quán)信息的外化存儲(chǔ),,框架給出了較好的支持,,通過(guò)配置<jdbc-user-service>元素,,指定自定義數(shù)據(jù)表以及提取用戶授權(quán)信息的SQL語(yǔ)句,這里不再詳細(xì)討論,。對(duì)于資源授權(quán)信息的外化存儲(chǔ),,框架沒有提供支持方法,也沒有留下擴(kuò)展接口,。不過(guò),,框架提供了調(diào)整安全過(guò)濾器鏈的功能,以及基于IoC容器管理組件的方式,,從而能夠用自定義組件替換默認(rèn)實(shí)現(xiàn),,進(jìn)行功能擴(kuò)展。首先,,自定義用戶表,、資源表、角色表以及相關(guān)映射表,,如圖1所示,。其次,配置資源授權(quán)接口的自定義實(shí)現(xiàn)類,,同時(shí)為其提供定制的提取資源授權(quán)信息的SQL語(yǔ)句,。再次,配置授權(quán)過(guò)濾器Bean,,將資源授權(quán)接口的自定義實(shí)現(xiàn)類配置到授權(quán)過(guò)濾器的objectDefinitionSource屬性中,,并利用框架提供的調(diào)整過(guò)濾器鏈功能標(biāo)簽    <custom-filter>將配置的授權(quán)過(guò)濾器Bean放到安全過(guò)濾器鏈的默認(rèn)授權(quán)過(guò)濾器之前,使得默認(rèn)授權(quán)過(guò)濾器不再執(zhí)行授權(quán)操作,。

001.jpg001.jpg

  3.3 資源授權(quán)接口實(shí)現(xiàn)

  當(dāng)Web容器裝載應(yīng)用時(shí),,spring會(huì)自動(dòng)解析配置文件中的資源授權(quán)信息,按特定格式生成默認(rèn)的資源授權(quán)實(shí)現(xiàn)類,。對(duì)于采用數(shù)據(jù)庫(kù)存儲(chǔ)資源授權(quán)信息的應(yīng)用,,必須自行將資源授權(quán)信息從數(shù)據(jù)庫(kù)中取出并按照特定格式存儲(chǔ)到資源授權(quán)接口實(shí)現(xiàn)對(duì)象中,并將此對(duì)象設(shè)置到授權(quán)過(guò)濾器的屬性中,。通過(guò)實(shí)現(xiàn)FactoryBean接口并且繼承JdbcDaoSupport的自定義類來(lái)提供資源授權(quán)對(duì)象,。其中關(guān)鍵是buildRequestMap()方法調(diào)用findResources()方法從數(shù)據(jù)庫(kù)中獲取資源授權(quán)信息,組裝成特定格式,,實(shí)現(xiàn)代碼如圖2和圖3所示,。其中findResources()方法通過(guò)內(nèi)部類ResourceMapping的execute()方法利用spring JDBC技術(shù)完成數(shù)據(jù)存取操作。

4 結(jié)束語(yǔ)

  Spring Security安全框架通過(guò)過(guò)濾器技術(shù),,為應(yīng)用提供了強(qiáng)大的Web資源保護(hù)機(jī)制,,安全命名空間更是進(jìn)一步簡(jiǎn)化了配置代碼,但默認(rèn)組件并不支持授權(quán)信息的外化存儲(chǔ)。本文對(duì)框架的認(rèn)證與授權(quán)流程及原理進(jìn)行了研究,,在此基礎(chǔ)上對(duì)用戶授權(quán)信息和資源授權(quán)信息的外化存儲(chǔ)進(jìn)行了設(shè)計(jì),,這種方案符合企業(yè)級(jí)應(yīng)用對(duì)于授權(quán)信息的動(dòng)態(tài)存儲(chǔ),對(duì)于應(yīng)用的權(quán)限設(shè)計(jì)方案具有一定的參考價(jià)值和實(shí)用性,。

參考文獻(xiàn)

  [1] 信科,,楊峰,楊光旭,,等.基于RBAC權(quán)限管理系統(tǒng)的優(yōu)化設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)技術(shù)與發(fā)展,,2011(7):172-174,249.

  [2] CRAIG W.Spring實(shí)戰(zhàn)[M].耿淵,,譯.北京:人民郵電出版社,,2011.

  [3] 羅時(shí)飛.敏捷Acegi、CAS[M].北京:電子工業(yè)出版社,,2005.

  [4] MAK G,, LONG J, RUBIO D. Spring攻略[M].陳宗恒,,姚軍,,蔣亮,譯.北京:人民郵電出版社,,2011.

  [5] 羅時(shí)飛.精通Spring—深入JavaEE開發(fā)核心技術(shù)[M].北京:電子工業(yè)出版社,2008.

  [6] 周秀,,劉培順,,劉加標(biāo),等.海洋環(huán)境云平臺(tái)訪問(wèn)控制系統(tǒng)研究[J].微型機(jī)與應(yīng)用,,2015,,34(7):9-12,23.

  [7] 路鵬,,殷兆麟.基于Spring的Acegi安全框架認(rèn)證與授權(quán)的分析及擴(kuò)展[J].計(jì)算機(jī)工程與設(shè)計(jì),,2007(6):1313-1316.

  [8] 許軍林,蔣年德.Acegi安全框架在Web系統(tǒng)中的應(yīng)用[J].現(xiàn)代計(jì)算機(jī)(專業(yè)版),,2007(9):25-26,,57.

  [9] 黎小紅.基于Spring框架應(yīng)用的權(quán)限控制系統(tǒng)的研究和實(shí)現(xiàn)[J].計(jì)算機(jī)與信息技術(shù),2006(11):4-7.


此內(nèi)容為AET網(wǎng)站原創(chuàng),,未經(jīng)授權(quán)禁止轉(zhuǎn)載,。