已閱讀5頁(yè),還剩50頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
你是否注意到在電視連續(xù)劇中大多數(shù)人是不鎖門的這是司空見(jiàn)慣的。在情景喜劇宋飛正傳(SEINFELD)中,克雷默常常到杰麗的房間里從冰箱中拿東西吃。在老友經(jīng)(FRIENDS)中,各種各樣的劇中人經(jīng)常不敲門就不加思索地進(jìn)入別人的房間。甚至有一次在倫敦,羅斯突然進(jìn)入錢德勒的旅館房間,差點(diǎn)兒撞見(jiàn)錢德勒和羅斯的妹妹的私情。在反斗小寶貝(LEAVEITTOBEAVER)熱播的年代,并不值得為人們不鎖門這一現(xiàn)象而大驚小怪。但是在如今這個(gè)隱私和安全極受重視的時(shí)代,看到電視劇中的角色允許他人大搖大擺地進(jìn)入自己的公寓房間或家中,實(shí)在讓人難以想像?,F(xiàn)實(shí)令人沮喪,有許多卑劣的人正在四處伺機(jī)偷走我們的金錢、財(cái)產(chǎn)、車輛和其他貴重物品。而隨著信息逐漸成為我們所擁有的最有價(jià)值的東西時(shí),竊賊們偷偷進(jìn)入無(wú)保護(hù)的應(yīng)用程序設(shè)法來(lái)偷取我們的數(shù)據(jù)和身份信息,也就不足為奇。做為軟件開(kāi)發(fā)人員,我們必須采取措施來(lái)保護(hù)我們應(yīng)用程序中的那些信息。無(wú)論你是通過(guò)用戶名/密碼來(lái)保護(hù)一個(gè)電子郵件賬號(hào),還是基于交易個(gè)人身份號(hào)碼來(lái)保護(hù)一個(gè)經(jīng)紀(jì)賬戶,安全性都是絕大多數(shù)應(yīng)用程序的一個(gè)重要切面。本書(shū)作者是有意選擇“切面”這個(gè)詞來(lái)描述應(yīng)用程序的安全性。安全性是超越應(yīng)用程序功能特性的一個(gè)關(guān)注點(diǎn)。通常來(lái)說(shuō),應(yīng)用程序不應(yīng)該親自參與到對(duì)自己的保護(hù)中。盡管你可以把與安全相關(guān)的處理直接編碼到應(yīng)用程序中(這種情況并不少見(jiàn)),但是更好的做法還是將安全考慮與應(yīng)用考慮分開(kāi)。聽(tīng)上去好像安全性是通過(guò)“面向切面”技術(shù)實(shí)現(xiàn)的,其實(shí)還是如此。在本章中,我們將研究利用切面保護(hù)應(yīng)用程序的方法。不過(guò),我們不必自己開(kāi)發(fā)那些切面我們將著眼于SPRINGSECURITY,這是一種基于SPRINGAOP和SERVLET過(guò)濾器7的安全框架。71SPRINGSECURITY介紹SPRINGSECURITY是一種為基于SPRING的應(yīng)用程序提供說(shuō)明性安全保護(hù)的安全框架。它提供全面的安全性解決方案,同時(shí)在WEB請(qǐng)求級(jí)和方法調(diào)用級(jí)處理身份確認(rèn)和授權(quán)。在SPRINGFRAMEWORK基礎(chǔ)上,SPRINGSECURITY充分利用了依賴注入(DI,DEPENDENCYINJECTION)和面向切面技術(shù)。711名稱中有什么在過(guò)去,SPRINGSECURITY也被稱為ACEGISECURITY(或者簡(jiǎn)稱為ACEGI)。ACEGI長(zhǎng)期以來(lái)一直是SPRING的一個(gè)子項(xiàng)目。但是在本書(shū)作者寫到這兒時(shí),正有計(jì)劃準(zhǔn)備將ACEGI更加緊密地置于SPRING項(xiàng)目傘之下。做為該行動(dòng)的一部分,將不再使用ACEGI這個(gè)名稱,而改用“SPRINGSECURITY”。按照計(jì)劃,這一更改將在ACEGI/SPRINGSECURITY的110版本中開(kāi)始實(shí)施。由于知道這一更改即將實(shí)施,因此本書(shū)作者決定先行一步,開(kāi)始將ACEGI稱為SPRINGSECURITY,不過(guò)讀者還會(huì)在本章中看到一些該名稱。在保護(hù)WEB應(yīng)用程序時(shí),SPRINGSECURITY使用SERVLET過(guò)濾器來(lái)攔截SERVLET請(qǐng)求,以實(shí)施身份認(rèn)證和執(zhí)行安全措施。并且,在第741節(jié)你將會(huì)看到,SPRINGSECURITY采取了一種獨(dú)特的機(jī)制來(lái)聲明SERVLET過(guò)濾器,使你可以使用SPRINGDI注入它所依賴的其他對(duì)象。SPRINGSECURITY還可以通過(guò)保護(hù)方法調(diào)用在一個(gè)較低層的級(jí)別上執(zhí)行安全措施。在保護(hù)方法時(shí),SPRINGSECURITY使用SPRINGAOP來(lái)代理對(duì)象,將“切面”應(yīng)用于對(duì)象,以確保用戶只有在擁有恰當(dāng)授權(quán)時(shí)才能調(diào)用受保護(hù)的方法。無(wú)論你是只在WEB請(qǐng)求級(jí)需要安全措施,還是需要較低層的方法安全措施,SPRINGSECURITY都是使用如圖71所示的5個(gè)主要組件來(lái)實(shí)施安全措施的。圖71SPRINGSECURITY的基本要素在研究SPRINGSECURITY安全機(jī)制的本質(zhì)之前,首先讓我們居高臨下地考察一下SPRINGSECURITY以及每一個(gè)組件在保護(hù)應(yīng)用程序中所扮演的角色。7111安全攔截器工作了一整天,當(dāng)你回到家時(shí),需要打開(kāi)家門上的鎖。而為了打開(kāi)那個(gè)鎖,你必須先將一把鑰匙插到鎖孔中,并恰當(dāng)?shù)負(fù)軇?dòng)鎖的制動(dòng)栓,以打開(kāi)彈簧鎖。如果鑰匙和鎖不匹配,就無(wú)法撥動(dòng)制動(dòng)栓,而彈簧鎖也就不會(huì)被打開(kāi)。但是如果你有正確的鑰匙,那么所有的制動(dòng)栓就都會(huì)接受這把鑰匙,彈簧鎖就會(huì)被打開(kāi),從而允許你把門打開(kāi)。在SPRINGSECURITY中,安全攔截器可以被看作是一把彈簧鎖,能夠阻止對(duì)應(yīng)用程序中受保護(hù)資源的訪問(wèn)。為了彈開(kāi)彈簧鎖,從而通過(guò)安全攔截器,你必須向系統(tǒng)提供“鑰匙”(通常是一對(duì)用戶名和密碼)。該“鑰匙”接著會(huì)嘗試撥開(kāi)安全攔截器的“制動(dòng)栓”,從而允許你訪問(wèn)受保護(hù)的資源。安全攔截器的實(shí)際實(shí)施將取決于所要保護(hù)的資源。如果讀者正要在某個(gè)WEB應(yīng)用程序中保護(hù)一個(gè)URL,那么相應(yīng)的安全攔截器將被當(dāng)做一個(gè)SERVLET過(guò)濾器來(lái)實(shí)施。但是如果你正要保護(hù)某個(gè)方法調(diào)用,那么切面將被用來(lái)加強(qiáng)安全性。讀者將會(huì)在本章稍后部分看到安全攔截器的這兩種形式。除了通過(guò)攔截對(duì)資源的訪問(wèn)來(lái)加強(qiáng)安全性之外,安全攔截器幾乎無(wú)所事事。它并不實(shí)際應(yīng)用安全規(guī)則。相反,它把該職責(zé)委托給圖71底部所示的各種管理器。下面讓我們從認(rèn)證管理器開(kāi)始,逐個(gè)看一下這些管理器。7112認(rèn)證管理器第一道必須打開(kāi)的安全攔截器的制動(dòng)栓就是認(rèn)證管理器。認(rèn)證管理器負(fù)責(zé)辨認(rèn)你是誰(shuí)。它是通過(guò)考慮你的主體(通常是一個(gè)用戶名)和你的憑證(通常是一個(gè)密碼)做到這點(diǎn)的。你的主體定義了你是誰(shuí),而你的憑證則是確認(rèn)你身份的證據(jù)。如果你的憑證足以使認(rèn)證管理器相信你的主體可以標(biāo)識(shí)你的身份,那么SPRINGSECURITY就能知道它是在和誰(shuí)打交道了。如同SPRINGSECURITY的其余部分(以及SPRING本身)一樣,認(rèn)證管理器也是一個(gè)基于接口的可插入組件。這使得它有可能與幾乎所有你能想象到的認(rèn)證機(jī)制一起使用SPRINGSECURITY。在本章稍后你將看到,SPRINGSECURITY帶有少數(shù)靈活的認(rèn)證管理器,它們包括絕大多數(shù)常見(jiàn)的認(rèn)證策略。7113訪問(wèn)決策管理器一旦SPRINGSECURITY確定了你是誰(shuí),它就必須決定你是否對(duì)受保護(hù)的資源擁有訪問(wèn)授權(quán)。訪問(wèn)決策管理器是SPRINGSECURITY鎖中第二道必須被打開(kāi)的制動(dòng)栓。訪問(wèn)決策管理器執(zhí)行授權(quán),它考慮你的身份認(rèn)證信息和與受保護(hù)資源關(guān)聯(lián)的安全屬性來(lái)決定是否讓你進(jìn)入。舉例來(lái)說(shuō),安全規(guī)則也許規(guī)定只有主管才允許訪問(wèn)某個(gè)受保護(hù)的資源。而如果你被授予了主管權(quán)限,那么第二道也是最后一道制動(dòng)栓訪問(wèn)決策管理器就會(huì)被打開(kāi),并且安全攔截器將會(huì)給你讓路,讓你取得對(duì)受保護(hù)資源的訪問(wèn)權(quán)。就像認(rèn)證管理器一樣,訪問(wèn)決策管理器也是可插入的。在本章稍后部分,我們將更進(jìn)一步研究SPRINGSECURITY所帶的訪問(wèn)決策管理器。7114運(yùn)行身份管理器如果你已經(jīng)通過(guò)了認(rèn)證管理器和訪問(wèn)決策管理器,那么安全攔截器就會(huì)被開(kāi)啟,門也就可以被打開(kāi)了。但是在你轉(zhuǎn)動(dòng)門把手進(jìn)去之前,安全攔截器可能還有一件事要做。即使你已經(jīng)通過(guò)身份認(rèn)證并且已經(jīng)獲得了訪問(wèn)某一資源的授權(quán),門后也許還有更多的安全限制在等著你。舉例來(lái)說(shuō),你也許已被授權(quán)查看某一WEB頁(yè)面,但是用于創(chuàng)建該頁(yè)面的對(duì)象可能有著與這一WEB頁(yè)面本身不同的安全要求。運(yùn)行身份管理器可以用來(lái)使用另一個(gè)身份替換你的身份,從而允許你訪問(wèn)應(yīng)用程序內(nèi)部更深處的受保護(hù)對(duì)象。注意,并不是所有應(yīng)用程序都會(huì)需要身份替換。因此,運(yùn)行身份管理器是一個(gè)可選的安全組件,在許多受SPRINGSECURITY保護(hù)的應(yīng)用程序中并不需要運(yùn)行身份管理器。7115調(diào)用后管理器SPRINGSECURITY的調(diào)用后管理器與其他安全管理器組件略有不同。其他安全管理器組件在受保護(hù)資源被訪問(wèn)之前實(shí)施某種形式的安全措施強(qiáng)制執(zhí)行,而調(diào)用后管理器則是在受保護(hù)資源被訪問(wèn)之后執(zhí)行安全措施。調(diào)用后管理器有點(diǎn)類似于在某些折扣商店和家用電器商店出口處等著檢查購(gòu)物小票的人。他們這樣做的目的是確保你擁有從商店里搬走那些值錢物品的適當(dāng)權(quán)利。不過(guò),調(diào)用后管理器是確保你被允許查看那些受保護(hù)資源返回的數(shù)據(jù),而不是確保你被允許從商店搬走大屏幕電視。如果調(diào)用后管理器建議一個(gè)服務(wù)層BEAN,那么它便將有機(jī)會(huì)檢查從所建議方法返回的值。接下來(lái),它可以決定當(dāng)前用戶是否被允許查看返回的對(duì)象。該調(diào)用后管理器還可以修改所返回的值,以確保當(dāng)前用戶只能夠訪問(wèn)返回對(duì)象的特定屬性。與運(yùn)行身份管理器類似,并不是所有應(yīng)用程序都會(huì)需要調(diào)用后管理器。你只會(huì)在你的應(yīng)用程序的安全方案要求訪問(wèn)被限制在每個(gè)實(shí)例基礎(chǔ)上的定義域水平時(shí)需要調(diào)用后管理器?,F(xiàn)在,你已經(jīng)看到了SPRINGSECURITY的全貌,我們就可以為ROADRANTZ應(yīng)用程序配置SPRINGSECURITY了。對(duì)我們來(lái)說(shuō),我們將不需要運(yùn)行身份管理器或調(diào)用后管理器,因此我們將把那兩個(gè)組件放到后面的高級(jí)SPRINGSECURITY主題中。下面,讓我們首先從配置認(rèn)證管理器開(kāi)始。72驗(yàn)證用戶身份在為應(yīng)用程序應(yīng)用安全措施時(shí),決定是否允許用戶訪問(wèn)受保護(hù)資源之前首先需要判斷用戶的身份。在絕大多數(shù)應(yīng)用程序中,這意味著為用戶顯示一個(gè)登錄界面,并要求他們提供用戶名和密碼。不同應(yīng)用程序提示用戶輸入其用戶名和密碼的方式有所不同。現(xiàn)在,我們假設(shè)用戶具體的登錄信息已經(jīng)提供,并且需要SPRINGSECURITY驗(yàn)證當(dāng)前用戶的身份。在本章稍后,我們將介紹以不同方式提示用戶輸入其用戶名和密碼的內(nèi)容。在SPRINGSECURITY中,認(rèn)證管理器負(fù)責(zé)確定用戶的身份。而認(rèn)證管理器是由ORGACEGISECURITYAUTHENTICATIONMANAGER接口定義的第三次一定會(huì)有好運(yùn)啊哈在AUTHENTICATIONMANAGER的程序包名稱中有ACEGI這個(gè)單詞。正如本章較早前提及的那樣,SPRINGSECURITY原先被稱為ACEGISECURITY。在ACEGI被正式更名為SPRINGSECURITY時(shí),其類的封裝方式也會(huì)更改。實(shí)際上,這將是ACEGI/SPRINGSECURITY已經(jīng)擁有的“第三壘”程序包名稱(譯者注“第三壘”是指在菱形球場(chǎng)上由本壘逆時(shí)針數(shù)的第三個(gè)壘,是選手到本壘之前的最后一壘)。ACEGI最初被封裝在NETSFACEGISECURITY之下接著它被更改為ORGACEGISECURITY。在110版發(fā)布時(shí),它將很可能被重新封裝在ORGSPRINGFRAMEWORKSECURITY之下。盡管如此,由于那些更改尚未發(fā)生,因此本章中的示例仍顯示ORGACEGISECURITY封裝方式。這里的AUTHENTICATE方法將會(huì)嘗試?yán)肙RGACEGISECURITYAUTHENTICATION對(duì)象(它帶有相應(yīng)的主體和憑證)來(lái)驗(yàn)證用戶身份。如果認(rèn)證成功,AUTHENTICATE方法會(huì)返回一個(gè)完整的AUTHENTICATION對(duì)象,其中包括用戶已被授予的權(quán)限信息(它們將由認(rèn)證管理器使用)。如果認(rèn)證失敗,則它會(huì)拋出一個(gè)AUTHENTICATIONEXCEPTION。正如你所看到的,AUTHENTICATIONMANAGER接口非常簡(jiǎn)單,你可以相當(dāng)輕松地執(zhí)行自己的AUTHENTICATIONMANAGER。但是SPRINGSECURITY提供有PROVIDERMANAGER,那是一個(gè)適用于絕大多數(shù)情形的AUTHENTICATIONMANAGER執(zhí)行。所以,讓我們看一下如何使用PROVIDERMANAGER,而不是討論開(kāi)發(fā)自己的認(rèn)證管理器。721配置PROVIDERMANAGERPROVIDERMANAGER是認(rèn)證管理器的一個(gè)實(shí)現(xiàn),它將驗(yàn)證身份的責(zé)任委托給一個(gè)或多個(gè)認(rèn)證提供者,如圖72所示。圖72PROVIDERMANAGER將身份驗(yàn)證的職責(zé)委托給一個(gè)或多個(gè)認(rèn)證提供者PROVIDERMANAGER的用途是使你能夠根據(jù)多個(gè)身份管理源來(lái)認(rèn)證用戶。它不是依靠自己實(shí)現(xiàn)身份驗(yàn)證,而是逐一認(rèn)證提供者的集合,直到某一個(gè)認(rèn)證提供者能夠成功地驗(yàn)證該用戶的身份(或者是已經(jīng)嘗試完了該集合中所有的認(rèn)證提供者)。這使得SPRINGSECURITY能夠?yàn)閱蝹€(gè)應(yīng)用程序提供多種認(rèn)證機(jī)制。下列XML程序塊顯示的是SPRING配置文件中PROVIDERMANAGER的一種典型配置通過(guò)PROVIDERMANAGER的PROVIDERS屬性,可以為其提供認(rèn)證提供者列表。通常你只需要一個(gè)認(rèn)證提供者,但是在某些情況下,提供由若干個(gè)認(rèn)證提供者組成的列表會(huì)十分有用。在這種情況下,如果一個(gè)認(rèn)證提供者驗(yàn)證身份失敗,可以嘗試另一個(gè)認(rèn)證提供者。SPRING提供了若干個(gè)認(rèn)證提供者,如表71所列表71SPRINGSECURITY提供的針對(duì)各種場(chǎng)合的認(rèn)證提供者認(rèn)證提供者(ORGACEGISECURITY)目的ADAPTERSAUTHBYADAPTERPROVIDER使用容器適配器驗(yàn)證身份。這使得驗(yàn)證在WEB容器(舉例來(lái)說(shuō),TOMCAT、JBOSS、JETTY、RESIN等)內(nèi)所創(chuàng)建的用戶的身份成為可能。PROVIDERSANONYMOUSANONYMOUSAUTHENTICATIONPROVIDER以匿名用戶方式驗(yàn)證用戶。在即使用戶尚未登錄,仍需要用戶令牌時(shí),會(huì)比較有用。續(xù)表認(rèn)證提供者(ORGACEGISECURITY)目的PROVIDERSCASCASAUTHENTICATIONPROVIDER根據(jù)JASIG“中心認(rèn)證服務(wù)”(CAS)驗(yàn)證身份。在用戶需要單點(diǎn)登錄能力時(shí)會(huì)比較有用。PROVIDERSDAODAOAUTHENTICATIONPROVIDER從數(shù)據(jù)庫(kù)中獲取用戶信息,包括用戶名和密碼。PROVIDERSDAOLDAPAUTHENTICATIONPROVIDER根據(jù)某一輕量級(jí)目錄訪問(wèn)協(xié)議(LDAP)服務(wù)器驗(yàn)證身份。PROVIDERSJAASJAASAUTHENTICATIONPROVIDER從JAAS登錄配置中獲取用戶信息。PROVIDERSREMEMBERMEREMEMBERMEAUTHENTICATIONPROVIDER驗(yàn)證某一之前驗(yàn)證過(guò)并且被記住的用戶的身份。這使得無(wú)需提示輸入用戶名和密碼即自動(dòng)登錄某一用戶成為可能。PROVIDERSRCPREMOTEAUTHENTICATIONPROVIDER根據(jù)遠(yuǎn)程服務(wù)驗(yàn)證用戶身份。PROVIDERSTESTINGAUTHENTICATIONPROVIDER用于單元測(cè)試。自動(dòng)認(rèn)為一個(gè)TESTINGAUTHENTICATIONTOKEN是有效的。不應(yīng)用于生產(chǎn)環(huán)境。PROVIDERSX509X509AUTHENTICATIONPROVIDER使用X509證書(shū)驗(yàn)證用戶身份。對(duì)于驗(yàn)證實(shí)際上是其他應(yīng)用程序(比如,某一WEB服務(wù)客戶端)的用戶身份會(huì)比較有用。RUNASRUNASIMPLAUTHENTICATIONPROVIDER針對(duì)身份已經(jīng)被運(yùn)行身份管理器替換的用戶進(jìn)行認(rèn)證。正如你在表71中所看到的那樣,SPRINGSECURITY幾乎為每一種需求都提供了一個(gè)認(rèn)證提供者。但是,如果仍未能找到符合你的應(yīng)用程序安全需求的認(rèn)證提供者,則可以隨時(shí)通過(guò)執(zhí)行ORGACEGISECURITYPROVIDERSAUTHENTICATIONPROVIDER接口來(lái)創(chuàng)建你自己的認(rèn)證提供者也許讀者已經(jīng)注意到,這個(gè)AUTHENTICATIONPROVIDER接口與前幾頁(yè)顯示的AUTHENTICATIONMANAGER接口沒(méi)有什么太大不同,它們都有一個(gè)處理認(rèn)證的AUTHENTICATE方法。實(shí)際上,可以把認(rèn)證提供者看做是第二等級(jí)的認(rèn)證管理器。限于篇幅,本書(shū)將無(wú)法詳細(xì)介紹SPRINGSECURITY的所有11個(gè)認(rèn)證提供者。不過(guò),這里將集中介紹兩個(gè)最常用的認(rèn)證提供者,首先從DAOAUTHENTICATIONPROVIDER開(kāi)始,它支持進(jìn)行簡(jiǎn)單的面向數(shù)據(jù)庫(kù)的身份驗(yàn)證。722根據(jù)數(shù)據(jù)庫(kù)驗(yàn)證身份許多應(yīng)用程序?qū)ㄓ脩裘兔艽a在內(nèi)的用戶信息保存在關(guān)系數(shù)據(jù)庫(kù)中。如果那就是你的應(yīng)用程序保留用戶信息的方式,那么你會(huì)發(fā)現(xiàn),對(duì)于你的應(yīng)用程序來(lái)說(shuō),選擇SPRINGSECURITY提供的DAOAUTHENTICATIONPROVIDER可能會(huì)比較好。DAOAUTHENTICATIONPROVIDER是一個(gè)簡(jiǎn)單的認(rèn)證提供者,它使用數(shù)據(jù)存取對(duì)象(DAO)來(lái)從關(guān)系數(shù)據(jù)庫(kù)中檢索用戶信息(包括用戶的密碼)。在取得了所需的用戶名和密碼之后,DAOAUTHENTICATIONPROVIDER通過(guò)比較從數(shù)據(jù)庫(kù)中檢索到的用戶名和密碼以及來(lái)自認(rèn)證管理器的通過(guò)AUTHENTICATION對(duì)象中傳入的主體和憑證完成身份驗(yàn)證(如圖73所示)。如果上述用戶名和密碼與主體和憑證相匹配,則用戶通過(guò)身份驗(yàn)證,同時(shí)返回給認(rèn)證管理器一個(gè)已完全填充好的AUTHENTICATION對(duì)象。否則會(huì)拋出一個(gè)AUTHENTICATIONEXCEPTION,表明身份驗(yàn)證失敗。圖73DAOAUTHENTICATIONPROVIDER通過(guò)從數(shù)據(jù)庫(kù)中獲取用戶信息幫助認(rèn)證管理器進(jìn)行身份驗(yàn)證配置一個(gè)DAOAUTHENTICATIONPROVIDER再簡(jiǎn)單不過(guò)了。下面這一段XML摘選顯示了如何聲明一個(gè)DAOAUTHENTICATIONPROVIDERBEAN,并且裝配上它所依賴的DAO這里的USERDETAILSSERVICE屬性被用來(lái)指定將用于從數(shù)據(jù)庫(kù)中檢索用戶信息的那個(gè)BEAN。這個(gè)屬性期望ORGACEGISECURITYUSERDETAILSUSERDETAILSSERVICE的一個(gè)實(shí)例。剩下來(lái)的問(wèn)題就是那個(gè)USERDETAILSSERVICEBEAN是如何配置的了。這里的USERDETAILSSERVICE接口要求只執(zhí)行一個(gè)方法這個(gè)方法相當(dāng)顯而易見(jiàn),而且讀者可能已經(jīng)在思考幾種可以實(shí)現(xiàn)這個(gè)接口的方法了。但是在你開(kāi)始自行編寫USERDETAILSSERVICE的實(shí)現(xiàn)之前,你可能有興趣知道SPRINGSECURITY帶有兩個(gè)現(xiàn)成的可供選擇的AUTHENTICATIONDAO實(shí)現(xiàn)INMEMORYDAOIMPL和JDBCDAOIMPL。下面讓我們來(lái)看一看這兩個(gè)類是如何查找用戶詳細(xì)信息的,首先從INMEMORYDAOIMPL開(kāi)始。7221使用內(nèi)存DAO盡管假定AUTHENTICATIONDAO對(duì)象將總是通過(guò)查詢關(guān)系數(shù)據(jù)庫(kù)來(lái)獲取用戶信息,可能看上去是一種很自然的想法,但實(shí)際上并不是必須要那樣的。如果你的應(yīng)用程序的身份驗(yàn)證需求是微不足道的,或者是為了開(kāi)發(fā)期間的方便起見(jiàn),也許更簡(jiǎn)單的做法是直接在SPRING配置文件中配置你的用戶信息。為此,SPRINGSECURITY提供了INMEMORYDAOIMPL,那是一個(gè)從SPRING配置文件中獲取用戶信息的USERDETAILSSERVICE實(shí)現(xiàn)。這里是你可能如何在SPRING配置文件中配置INMEMORYDAOIMPL的一個(gè)示例這里的USERMAP屬性通過(guò)一個(gè)ORGACEGISECURITYUSERDETAILSMEMORYUSERMAP對(duì)象來(lái)定義一組用戶名、密碼和權(quán)限。幸運(yùn)的是,在裝配INMEMORYDAOIMPL時(shí),你不必為構(gòu)建一個(gè)USERMAP實(shí)例而操心,因?yàn)镾PRINGSECURITY提供有一個(gè)屬性編輯器,它能夠幫你把一個(gè)STRING轉(zhuǎn)化為一個(gè)USERMAP對(duì)象。在這個(gè)USERMAP的每一行上,STRING都是一個(gè)名字值對(duì),其中名字就是用戶名,值是一個(gè)由逗號(hào)分隔的列表,它以相應(yīng)用戶的密碼開(kāi)頭,后面跟著一個(gè)或多個(gè)準(zhǔn)備授予該用戶的權(quán)限的名稱。圖74分解開(kāi)了上述用戶映像中的一個(gè)條目格式。圖74SPRINGSECURITY用戶映像中一個(gè)用戶名對(duì)應(yīng)一個(gè)密碼、授予的權(quán)限以及它們的狀態(tài)(可選)在前面的AUTHENTICATIONDAOBEAN聲明中,定義了四個(gè)用戶PALMERD、BAUERJ、OBRIANC和MYERSN。他們的密碼分別是4MOREYEARS、INEEDSLEEP、NOSMILE和TRAITOR。各用戶的權(quán)限授予情況如下N用戶名為PALMERD的用戶已被給予ROLE_PRESIDENT權(quán)限;NBAUERJ被給予ROLE_FIELD_OPS;NMYERSN被給予ROLE_CENTRAL_OPS;NOBRIANC用戶被授予兩個(gè)權(quán)限ROLE_SR_ANALYST和ROLE_OPS。需要特別注意這里的PALMERD和MYERSN。在他們的密碼之后,緊接著一個(gè)特殊的DISABLED標(biāo)志,表明他們已經(jīng)被禁用(因此無(wú)法驗(yàn)證身份)。盡管INMEMORYDAOIMPL既方便又簡(jiǎn)單,但是它有一些顯而易見(jiàn)的局限性。主要是,對(duì)安全性進(jìn)行管理時(shí)要求你編輯SPRING配置文件并且重新部署應(yīng)用。雖然在開(kāi)發(fā)環(huán)境下這是可以接受的(而且可能還是有幫助的),但是對(duì)于生產(chǎn)用途而言這種做法就太笨拙了。因此,本書(shū)作者強(qiáng)烈反對(duì)在生產(chǎn)環(huán)境下使用INMEMORYDAOIMPL。相反,你應(yīng)該考慮使用我們接下來(lái)將介紹的JDBCDAOIMPL。7222聲明一個(gè)JDBCDAOJDBCDAOIMPL是一個(gè)簡(jiǎn)單而靈活的認(rèn)證DAO,它從關(guān)系數(shù)據(jù)庫(kù)中檢索用戶的信息。在它最簡(jiǎn)單的形式中,只需要一個(gè)JAVAXSQLDATASOURCE對(duì)象的引用,而且它可以通過(guò)以下方式在SPRING配置文件中進(jìn)行聲明正如這里配置的那樣,JDBCDAOIMPL對(duì)用戶信息在相應(yīng)數(shù)據(jù)庫(kù)中的存儲(chǔ)情況做了一些基本的假設(shè)。特別是,它假設(shè)有一張“USERS”表和一張“AUTHORITIES”表,如圖75所示。當(dāng)JDBCDAOIMPL查找用戶信息時(shí),它會(huì)使用下列SQL作為查詢語(yǔ)句類似地,當(dāng)查找某個(gè)用戶的授權(quán)時(shí),JDBCDAOIMPL會(huì)使用下列SQL盡管JDBCDAOIMPL假定的表結(jié)構(gòu)非常直接,它們很可能與你已經(jīng)為自己的應(yīng)用程序安全建立的表結(jié)構(gòu)不一致。比如,在ROADRANTZ應(yīng)用程序中,MOTORIST表保存已注冊(cè)用戶的用戶名(在EMAIL列中)和密碼。這是否意味著我們無(wú)法在ROADRANTZ應(yīng)用程序中使用JDBCDAOIMPL來(lái)驗(yàn)證駕車者的身份呢當(dāng)然不是。但是如果準(zhǔn)備使用JDBCDAOIMPL,我們就必須費(fèi)點(diǎn)力氣通過(guò)設(shè)置USERSBYUSERNAMEQUERY屬性來(lái)告訴它如何找到用戶信息。以下對(duì)AUTHENTICATIONDAOBEAN的調(diào)整將使得它能夠從ROADRANTZ的MOTORIST表中查詢用戶現(xiàn)在,JDBCDAOIMPL已經(jīng)知道到MOTORIST表中查找認(rèn)證信息了。但是,我們還必須告訴JDBCDAOIMPL如何在相應(yīng)數(shù)據(jù)庫(kù)中查詢某一用戶的授權(quán)。為此,我們將設(shè)置AUTHORITIESBYUSERNAMEQUERY屬性到這里,我們已經(jīng)配置好JDBCDAOIMPL從MOTORIST_PRIVILEGES表中檢索駕車者的授權(quán)。這里的查詢還加入了MOTORIST表,那是因?yàn)镸OTORIST_PRIVILEGES表只是通過(guò)一個(gè)外關(guān)鍵字來(lái)了解某個(gè)MOTORIST的,而JDBCDAOIMPL期望這個(gè)查詢能通過(guò)用戶名檢索權(quán)限。7223使用加密的密碼當(dāng)DAOAUTHENTICATIONPROVIDER將用戶在身份驗(yàn)證時(shí)提供的密碼與從數(shù)據(jù)庫(kù)中檢索到密碼相比較時(shí),它假設(shè)一直存儲(chǔ)著的那個(gè)密碼是沒(méi)有加密的。為了增強(qiáng)安全性,你可能會(huì)希望在將那個(gè)密碼存儲(chǔ)到數(shù)據(jù)庫(kù)中之前對(duì)它進(jìn)行加密。但是,如果那個(gè)密碼以加密形式存儲(chǔ)在數(shù)據(jù)庫(kù)中,那么用戶提供的密碼必須也要加密,只有這樣,這兩個(gè)密碼才能相互比較。為了適應(yīng)加密的密碼,DAOAUTHENTICATIONPROVIDER可以裝配一個(gè)密碼編碼器。SPRINGSECURITY帶有幾個(gè)密碼編碼器可供選擇,如表72所示。表72SPRINGSECURITY的密碼編碼器密碼編碼器(ORGACEGISECURITYPROVIDERS)目的ENCODINGMD5PASSWORDENCODER在密碼上執(zhí)行“信息摘要”(MD5)編碼ENCODINGPLAINTEXTPASSWORDENCODER在密碼上不執(zhí)行任何編碼,照原樣返回它ENCODINGSHAPASSWORDENCODER在密碼上執(zhí)行“安全散列算法”(SHA)編碼LDAPAUTHENTICATORLDAPSHAPASSWORDENCODER使用LDAPSHA和SALTEDSHA(SSHA)編碼技術(shù)編碼密碼在默認(rèn)情況下,DAOAUTHENTICATIONPROVIDER使用PLAINTEXTPASSWORDENCODER,那意味著密碼仍然沒(méi)有被編碼。但是,我們可以通過(guò)設(shè)置DAOAUTHENTICATIONPROVIDER的PASSWORDENCODER屬性來(lái)指定另一種編碼方法。舉例來(lái)說(shuō),要讓DAOAUTHENTICATIONPROVIDER使用MD5編碼技術(shù),可以加入以下代碼你還將需要為編碼器設(shè)置一個(gè)種子源(SALTSOURCE)。一個(gè)種子源為所用的編碼技術(shù)提供種子(SALT),或者稱加密密鑰。SPRINGSECURITY提供有兩個(gè)種子源NSYSTEMWIDESALTSOURCE對(duì)所有用戶提供相同的種子;NREFLECTIONSALTSOURCE利用用戶的USER對(duì)象中某個(gè)指定屬性的反射來(lái)生成種子。在這兩個(gè)種子源中,REFLECTIONSALTSOURCE更加安全,因?yàn)槊恳粋€(gè)用戶的密碼很可能會(huì)使用不同的種子值來(lái)編碼。即使假設(shè)有黑客推測(cè)出了用來(lái)編碼某個(gè)用戶密碼的種子,他們也不太可能使用同一個(gè)種子破解開(kāi)另一個(gè)用戶的密碼。要想使用一個(gè)REFLECTIONSALTSOURCE,可以通過(guò)如下方式將它裝配到DAOAUTHENTICATIONPROVIDER的SALTSOURCE屬性中在這里,用戶的USERNAME屬性被用作種子來(lái)加密用戶的密碼。要特別值得重視的是,必須保證該種子是靜態(tài)的,而且永遠(yuǎn)不會(huì)改變;否則,就再也不可能對(duì)這個(gè)用戶身份進(jìn)行驗(yàn)證了(除非是在使用新的種子更改之后,那個(gè)密碼又被重新編碼回來(lái)了)。盡管REFLECTIONSALTSOURCE的確是更加安全,但是SYSTEMWIDESALTSOURCE更加簡(jiǎn)單,而且對(duì)于絕大多數(shù)情況來(lái)說(shuō)已經(jīng)足夠。SYSTEMWIDESALTSOURCE使用單個(gè)種子值加密所有用戶的密碼。要想使用一個(gè)SYSTEMWIDESALTSOURCE,可以通過(guò)如下方式裝配SALTSOURCE屬性在這里,相同的種子值A(chǔ)BC123XYZ789被用于加密所有密碼。7224緩存用戶信息每次當(dāng)請(qǐng)求一個(gè)受保護(hù)的資源時(shí),認(rèn)證管理器就被調(diào)用以檢索用戶的安全信息。但是如果檢索用戶信息涉及到要查詢數(shù)據(jù)庫(kù),那么每次都查詢相同的數(shù)據(jù)就可能會(huì)妨礙應(yīng)用性能。考慮到用戶的信息一般不會(huì)頻繁改變,因此也許更好的做法是根據(jù)第一次查詢緩存那些用戶數(shù)據(jù),然后在后續(xù)的每次查詢中從緩存中檢索用戶信息。為了啟用用戶信息的緩存功能,我們必須給DAOAUTHENTICATIONPROVIDER提供ORGACEGISECURITYPROVIDERSDAOUSERCACHE接口的一個(gè)實(shí)現(xiàn)。這個(gè)接口批準(zhǔn)三個(gè)方法的執(zhí)行USERCACHE中的這幾個(gè)方法都無(wú)需加以說(shuō)明,它們提供向緩存中放入、檢索或刪除用戶明細(xì)信息的功能。這樣以來(lái),編寫你自己的USERCACHE實(shí)現(xiàn)就應(yīng)該相當(dāng)簡(jiǎn)單了。然而,在你考慮開(kāi)發(fā)自己的USERCACHE實(shí)現(xiàn)之前,應(yīng)該首先考慮SPRINGSECURITY提供的兩個(gè)方便的實(shí)現(xiàn)NORGACEGISECURITYPROVIDERSDAOCACHENULLUSERCACHENORGACEGISECURITYPROVIDERSDAOCACHEEHCACHEBASEDUSERCACHE事實(shí)上,NULLUSERCACHE并不執(zhí)行任何緩存行為。相反,它每次都是從它的GETUSERFROMCACHE方法返回NULL,促使DAOAUTHENTICATIONPROVIDER來(lái)查詢用戶信息。這是DAOAUTHENTICATIONPROVIDER使用的默認(rèn)USERCACHE實(shí)現(xiàn)。EHCACHEBASEDUSERCACHE是一個(gè)更加有用的緩存實(shí)現(xiàn)。顧名思義,它是基于EHCACHE實(shí)現(xiàn)的。和DAOAUTHENTICATIONPROVIDER一起使用EHCACHE是很簡(jiǎn)單的,只需要將一個(gè)EHCACHEBASEDUSERCASEBEAN裝配進(jìn)DAOAUTHENTICATIONPROVIDER的USERCACHE屬性即可這里的CACHE屬性引用一個(gè)EHCACHEBEAN,后者應(yīng)該是一個(gè)EHCACHECACHE對(duì)象。得到那樣一個(gè)CACHE對(duì)象的一種途徑是使用SPRINGMODULES的緩存模塊。舉例來(lái)說(shuō),下面這段XML就使用SPRINGMODULES來(lái)配置EHCACHE讀者可能還記得本書(shū)第5章的內(nèi)容,SPRINGMODULES的EHCACHEFACTORYBEAN是一種SPRINGFACTORYBEAN,它生成一個(gè)EHCACHECACHE對(duì)象。實(shí)際的緩存配置是在EHCACHEXML文件中找到的,它將會(huì)從類途徑中檢索到。當(dāng)你的應(yīng)用程序的安全信息保存在某一關(guān)系數(shù)據(jù)庫(kù)中時(shí),DAOAUTHENTICATIONPROVIDER將非常棒。不過(guò),一個(gè)應(yīng)用程序的安全性經(jīng)常構(gòu)建成根據(jù)一個(gè)LDAP服務(wù)器進(jìn)行身份驗(yàn)證。下面讓我們來(lái)看一下如何使用SPRINGSECURITY的LDAPAUTHENTICATIONPROVIDER,在必須通過(guò)LDAP進(jìn)行身份驗(yàn)證時(shí),它是更加適用的一種選擇。723根據(jù)LDAP倉(cāng)庫(kù)進(jìn)行身份驗(yàn)證SPRINGSECURITY支持通過(guò)LDAPAUTHENTICATIONPROVIDER根據(jù)LDAP進(jìn)行身份驗(yàn)證,LDAPAUTHENTICATIONPROVIDER是一個(gè)知道如何根據(jù)LDAP倉(cāng)庫(kù)查看用戶憑證的認(rèn)證提供者。下列舉例說(shuō)明的是針對(duì)LDAPAUTHENTICATIONPROVIDER的一種典型配置正如讀者可以看到的那樣,LDAPAUTHENTICATIONPROVIDER并沒(méi)有太多令人興奮的地方,那兒沒(méi)有有關(guān)如何找到相應(yīng)LDAP服務(wù)器或倉(cāng)庫(kù)初始上下文的具體信息。相反,LDAPAUTHENTICATIONPROVIDER通過(guò)構(gòu)造函數(shù)注入,與一個(gè)AUTHENTICATOR和一個(gè)POPULATOR裝配在一起。那些BEAN是什么,它們是用來(lái)干什么的事實(shí)上,盡管LDAPAUTHENTICATIONPROVIDER聲稱知道如何與一個(gè)LDAP倉(cāng)庫(kù)對(duì)話,但它實(shí)際上依賴兩個(gè)策略對(duì)象來(lái)做真正的工作NAUTHENTICATOR策略根據(jù)LDAP倉(cāng)庫(kù)處理實(shí)際的身份驗(yàn)證(舉例來(lái)說(shuō),驗(yàn)證用戶憑證)。AUTHENTICATOR策略可以是任何實(shí)現(xiàn)ORGACEGISECURITYPROVIDERSLDAPLDAPAUTHENTICATOR的對(duì)象。NPOPULATOR策略負(fù)責(zé)從LDAP倉(cāng)庫(kù)檢索用戶獲得的權(quán)限集。POPULATOR策略是任何實(shí)現(xiàn)ORGACEGISECURITYPROVIDERSLDAPLDAPAUTHORITIESPOPULATOR的對(duì)象。由于認(rèn)證和權(quán)限責(zé)任被定義為策略,從LDAPAUTHENTICATIONPROVIDER分離出來(lái)了,你就能夠在最適合你的應(yīng)用程序安全需求的策略實(shí)現(xiàn)中進(jìn)行裝配了。因此,剩下的問(wèn)題就是這AUTHENTICATOR和POPULATORBEAN是如何定義的了。下面讓我們考察AUTHENTICATORBEAN開(kāi)始,它為L(zhǎng)DAPAUTHENTICATIONPROVIDER定義認(rèn)證策略。7231利用LDAP綁定進(jìn)行身份驗(yàn)證在要根據(jù)LDAP進(jìn)行身份驗(yàn)證時(shí),通常會(huì)采取以下兩種方法N利用一個(gè)LDAP用戶的用戶名和密碼綁定到LDAP服務(wù)器;N在LDAP中檢索一個(gè)用戶的條目,然后將提供的密碼和檢索到的LDAP記錄中的密碼屬性相比較。為了綁定身份驗(yàn)證,SPRINGSECURITY帶有一個(gè)稱為BINDAUTHENTICATOR的LDAPAUTHENTICATOR實(shí)現(xiàn)。BINDAUTHENTICATOR使用一個(gè)LDAPBIND運(yùn)算符來(lái)把一個(gè)用戶綁定到LDAP服務(wù)器。這種方法依靠LDAP服務(wù)器來(lái)驗(yàn)證所綁定用戶的憑證。下列在SPRING中聲明一個(gè)BINDAUTHENTICATOR在這里,我們已經(jīng)聲明這個(gè)BINDAUTHENTICATOR是通過(guò)一個(gè)構(gòu)造函數(shù)參數(shù)和通過(guò)USERDNPATTERNS屬性來(lái)注入的。稍后我們將回到這個(gè)構(gòu)造函數(shù)參數(shù)。首先,讓我們考慮那個(gè)USERDNPATTERNS屬性。這個(gè)USERDNPATTERNS屬性是用來(lái)告訴BINDAUTHENTICATOR如何在LDAP中找到某個(gè)用戶的。它的值是一個(gè)模式列表,是BINDAUTHENTICATOR將用做識(shí)別名(DN)來(lái)識(shí)別用戶的一個(gè)或多個(gè)模式。在這里,我們只使用一個(gè)DN模式,如圖76所示。DN模式中的0是一個(gè)充當(dāng)用戶名占位符的模式參數(shù)。舉例來(lái)說(shuō),如果用戶名為CWAGON,那么用來(lái)綁定到LDAP的DN將是UIDCWAGON,OUMOTORISTS。現(xiàn)在,回到前面那個(gè)構(gòu)造函數(shù)參數(shù)。為了能夠做好自己的工作,BINDAUTHENTICATOR需要知道的主要事情是如何訪問(wèn)相應(yīng)的LDAP倉(cāng)庫(kù)。因此,它和一個(gè)構(gòu)造函數(shù)參數(shù)一同構(gòu)建,裝配到INITIALDIRCONTEXTFACTORY,其聲明方式如下DEFAULTINITIALDIRCONTEXTFACTORY捕獲連接到一臺(tái)LDAP服務(wù)器所需的全部信息,并生成一個(gè)JNDIDIRCONTEXT對(duì)象。如果讀者不太了解JNDI或DIRCONTEXT,則不必?fù)?dān)心這些具體細(xì)節(jié),只需記住BINDAUTHENTICATOR是利用DEFAULTINITIALDIRCONTEXTFACTORY來(lái)獲悉如何到達(dá)相應(yīng)的LDAP倉(cāng)庫(kù)即可。用來(lái)創(chuàng)建DEFAULTINITIALDIRCONTEXTFACTORY的那個(gè)構(gòu)造函數(shù)參數(shù)和LDAP提供者的URL一起裝配。在這里,我們已經(jīng)把它和對(duì)ROADRANTZLDAP服務(wù)器8的一個(gè)引用裝配在一起,并且在DCROADRANTZ,DCCOM處建立了初始上下文。用來(lái)查找用戶信息的DN將被關(guān)系到這個(gè)初始上下文。7232通過(guò)比較密碼進(jìn)行身份驗(yàn)證做為綁定認(rèn)證之外的一種可選方式,SPRINGSECURITY還支持通過(guò)使用PASSWORDCOMPARISONAUTHENTICATOR的密碼比較進(jìn)行身份驗(yàn)證。PASSWORDCOMPARISONAUTHENTICATOR通過(guò)比較提供的密碼和用戶記錄中的一個(gè)密碼屬性(在默認(rèn)情況下是USERPASSWORD)進(jìn)行工作。它在SPRING中的配置可能如下所示注意,除了類名稱外,這個(gè)PASSWORDCOMPARISONAUTHENTICATOR聲明與前面的BINDAUTHENTICATOR聲明完全相同。那是因?yàn)樵谒鼈兊淖詈?jiǎn)單格式中,兩者在根本上是相同的。它們都需要一個(gè)初始化上下文工廠來(lái)知道如何到達(dá)相應(yīng)的LDAP倉(cāng)庫(kù),而且都需要一個(gè)或多個(gè)DN模式來(lái)定位用戶記錄。但是,還有一些屬性可以用來(lái)自定義PASSWORDCOMPARISONAUTHENTICATOR。舉例來(lái)說(shuō),如果默認(rèn)的USERPASSWORD屬性并不符合你的需求,則可以通過(guò)裝配一個(gè)新的值到PASSWORDATTRIBUTENAME屬性來(lái)覆蓋它。比如說(shuō),按如下方式聲明PASSWORDCOMPARISONAUTHENTICATOR,以對(duì)照名為USERCREDENTIALS的屬性比較所提供的密碼你可能選擇的另一個(gè)自定義內(nèi)容是密碼如何在LDAP中編碼。在默認(rèn)情況下,PASSWORDCOMPARISONAUTHENTICATOR使用SPRINGSECURITY的LDAPSHAPASSWORDENCODER在比較之前編碼密碼。LDAPSHAPASSWORDENCODER支持LDAP“安全散列算法”(SHA)和SSHA(SALTEDSHA)編碼技術(shù)。但是如果這些不符合你的需求,任何一個(gè)ORGACEGISECURITYPROVIDERSENCODINGPASSWORDENCODER實(shí)現(xiàn)(包括表72中的那些)都可以被裝配進(jìn)PASSWORDENCODER屬性中。舉例來(lái)說(shuō),如果需要在LDAP中以純文本方式存儲(chǔ)密碼(不建議這樣,但是可能有這樣的情況),那么可以像下面這樣聲明PASSWORDCOMPARISONAUTHENTICATOR在轉(zhuǎn)而研究POPULATOR策略BEAN之前,讓我們?cè)僮詈笳{(diào)整一下INITIALDIRCONTEXTFACTORYBEAN。與BINDAUTHENTICATOR不同,PASSWORDCOMPARISONAUTHENTICATOR并不利用用戶的DN綁定到LDAP。有些LDAP提供者允許匿名綁定,在那種情況下,INITIALDIRCONTEXTFACTORY將會(huì)照常工作。不過(guò),出于安全考慮,絕大多數(shù)LDAP提供者并不允許匿名綁定,因此我們將需要為DEFAULTINITIALDIRCONTEXTFACTORY提供一個(gè)管理器DN和密碼來(lái)綁定當(dāng)DEFAULTINITIALDIRCONTEXTFACTORY訪問(wèn)LDAP時(shí),它會(huì)綁定為那個(gè)管理器,并且在比較用戶的密碼時(shí)代表該用戶?,F(xiàn)在,讓我們來(lái)配置POPULATOR策略BEAN,以完成整個(gè)LDAP身份驗(yàn)證內(nèi)容。7233聲明POPULATOR策略BEAN驗(yàn)證用戶身份只是LDAPAUTHENTICATIONPROVIDER執(zhí)行的第一步。一旦用戶的身份被確定,LDAPAUTHENTICATIONPROVIDER必須檢索該用戶被授予的權(quán)限列表,以確定該用戶在當(dāng)前應(yīng)用程序中具有哪些權(quán)力。如同身份驗(yàn)證的情況一樣,LDAPAUTHENTICATORPROVIDER使用一個(gè)策略對(duì)象來(lái)從LDAP查找用戶被授予的權(quán)限。SPRINGSECURITY帶有一個(gè)LDAPAUTHORITIESPOPULATOR接口的實(shí)現(xiàn)DEFAULTLDAPAUTHORITIESPOPULATOR。下面是DEFAULTLDAPAUTHORITIESPOPULATOR在SPRING中的配置情況讀者首先會(huì)注意到的是,DEFAULTLDAPAUTHORITIESPOPULATOR的構(gòu)建中包含兩個(gè)構(gòu)造函數(shù)參數(shù),其中第一個(gè)是對(duì)我們的老朋友INITIALDIRCONTEXTFACTORY的一個(gè)引用。幾乎和AUTHENTICATOR策略BEAN一樣,POPULATOR策略BEAN需要知道如何到達(dá)相應(yīng)的LDAP倉(cāng)庫(kù),以檢索用戶被授予的權(quán)限。第二個(gè)構(gòu)造函數(shù)參數(shù)幫助DEFAULTLDAPAUTHORITIESPOPULATOR在LDAP倉(cāng)庫(kù)中查找組。由于LDAP倉(cāng)庫(kù)實(shí)際上是分層的,安全組隨處可見(jiàn)。這個(gè)構(gòu)造函數(shù)參數(shù)指定一個(gè)基礎(chǔ)DN,根據(jù)它來(lái)搜索組。這個(gè)基礎(chǔ)DN與初始上下文相關(guān)。因此,對(duì)于組基礎(chǔ)DN為“OUGROUPS”的情況,我們將搜索“OUGROUPS,DCROADRANTZ,DCCOM”中的組。最后,這里的GROUPROLEATTRIBUTE屬性指定將包含角色信息(它們實(shí)際上能被轉(zhuǎn)化成用戶被授予的權(quán)限)的特征名稱。它的默認(rèn)值為CN,但是在這個(gè)示例中,我們把它設(shè)置成了OU。這樣配置之后,DEFAULTLDAPAUTHORITIESPOPULATOR就會(huì)檢索到所有包含指定用戶的組更確切地說(shuō),應(yīng)該是所有MEMBER屬性為該用戶DN的組。舉例來(lái)說(shuō),假設(shè)你有一個(gè)LDAP倉(cāng)庫(kù),填充有下列LDIF9當(dāng)名為CRAIG的用戶通過(guò)身份驗(yàn)證時(shí),他獲得的權(quán)限將包括ROLE_MOTORIST和ROLE_VIP。但是,當(dāng)RAYMIE通過(guò)身份驗(yàn)證時(shí),她獲得的權(quán)限將只包括ROLE_MOTORIST,因?yàn)閂IPS組的MEMBER屬性中并沒(méi)有她的DN。注意,這里的組名稱(在OU屬性中)被變換成大寫字母,然后再加上前綴ROLE_。這里將大小寫歸一化,只是為了方便幫助找到用戶的權(quán)限,而不必管它是小寫的還是大寫的。你可以通過(guò)把CONVERTTOUPPERCASE屬性設(shè)置為FALSE來(lái)關(guān)閉這一行為。這里的ROLE_前綴是為了ROLEVOTER而提供的,我們將在732節(jié)中討論它。如果你更希望使用另一個(gè)不同的角色前綴,則可以根據(jù)自己的喜好任意配置DEFAULTLDAPAUTHORITIESPOPULATOR的ROLEPREFIX屬性。舉例來(lái)說(shuō),要想關(guān)閉大寫字母歸一化,并且將角色前綴更改為GROUP_,則可以像下面那樣配置DEFAULTLDAPAUTHORITIESPOPULATOR你可能希望對(duì)DEFAULTLDAPAUTHORITIESPOPULATOR做的再一個(gè)調(diào)整就是更改它查找成員的方式。一般來(lái)說(shuō),它查找MEMBER屬性含有所需用戶DN的組。如果你的LDAP被設(shè)置成如此使用MEMBER屬性,那么一切OK。但是,讓我們假設(shè)你的LDAP倉(cāng)庫(kù)使用一個(gè)ASSOCIATE屬性(而不是MEMBER屬性)跟蹤成員資格。在那種情況下,你將希望像下面那樣設(shè)置DEFAULTLDAPAUTHORITIESPOPULATOR的GROUPSEARCHFILTER屬性請(qǐng)注意,這里的GROUPSEARCHFILTER屬性使用0模式參數(shù)表示用戶的DN。現(xiàn)在,我們已經(jīng)學(xué)會(huì)了如何使用SPRINGSECURITY的身份驗(yàn)證處理BEAN來(lái)識(shí)別用戶。接下來(lái),讓我們看一下SPRINGSECURITY是如何確定一個(gè)已通過(guò)驗(yàn)證的用戶是否擁有訪問(wèn)受保護(hù)資源的適當(dāng)權(quán)限的。73控制訪問(wèn)身份驗(yàn)證只是SPRINGSECURITY安全保護(hù)機(jī)制中的第一步。一旦SPRINGSECURITY弄清用戶的身份后,它必須決定是否允許用戶訪問(wèn)由它保護(hù)的資源。在圖71中,我們已經(jīng)配置了認(rèn)證管理器?,F(xiàn)在,該配置訪問(wèn)決策管理器了。訪問(wèn)決策管理器負(fù)責(zé)決定用戶是否擁有恰當(dāng)?shù)臋?quán)限訪問(wèn)受保護(hù)的資源。它們是由ORGACEGISECURITYACCESSDECISIONMANAGER接口定義的這里的SUPPORTS方法根據(jù)受保護(hù)資源的類類型以及它的配置屬性(受保護(hù)資源的訪問(wèn)要求)來(lái)判斷訪問(wèn)決策管理器是否能夠針對(duì)該資源做出訪問(wèn)決策。這里的DECIDE方法是完成最終決定的地方。如果它沒(méi)有拋出一個(gè)ACCESSDENIEDEXCEPTION或者是INSUFFICIENTAUTHENTICATIONEXCEPTION而返回,則允許訪問(wèn)受保護(hù)的資源。否則,訪問(wèn)被拒絕。731訪問(wèn)決策投票SPRINGSECURITY的訪問(wèn)決策管理器最終負(fù)責(zé)為一個(gè)已通過(guò)身份驗(yàn)證的用戶確定訪問(wèn)權(quán)限。不過(guò),它們并不是完全依靠自己而完成這些決策的,而是通過(guò)征詢一個(gè)或多個(gè)對(duì)某一用戶是否有權(quán)訪問(wèn)受保護(hù)資源進(jìn)行投票的對(duì)象。一旦獲得所有的投票結(jié)果,決策管理器便將統(tǒng)計(jì)得票情況,并做出它的最終決定。如表73所列,SPRINGSECURITY帶有ACCESSDECISIONMANAGER的三個(gè)實(shí)現(xiàn),每一個(gè)都采用一種不同的方法來(lái)統(tǒng)計(jì)得票情況。表73SPRINGSECURITY的訪問(wèn)決策管理器通過(guò)統(tǒng)計(jì)是否允許某一用戶進(jìn)入的得票來(lái)幫助決定是否同意該用戶訪問(wèn)訪問(wèn)決策管理器如何決定同意/拒絕訪問(wèn)ORGACEGISECURITYVOTEAFFIRMATIVEBASED只要有一個(gè)投票者投票贊成授予訪問(wèn)權(quán),就允許訪問(wèn)ORGACEGISECURITYVOTECONSENSUSBASED只要大多數(shù)投票者投票贊成授予訪問(wèn)權(quán),就允許訪問(wèn)ORGACEGISECURITYVOTEUNANIMOUSBASED只有當(dāng)所有投票者都投票贊成授予訪問(wèn)權(quán)時(shí),才允許訪問(wèn)在SPRING配置文件中,所有的訪問(wèn)決策管理器都是以相同的方式進(jìn)行配置的。比如說(shuō),下面這一段XML選段配置了一個(gè)UNANIMOUSBASED訪問(wèn)決策管理器通過(guò)這里的DECISIONVOTERS屬性,你可以為訪問(wèn)決策管理器提供一組投票者。在上述情況中,只有一個(gè)投票者,它引用了一個(gè)名為ROLEVOTER的BEAN。下面讓我們看一下這個(gè)ROLEVOTER是如何配置的。732決定如何投票盡管訪問(wèn)決策投票者對(duì)是否授權(quán)訪問(wèn)某個(gè)受保護(hù)的資源沒(méi)有最終發(fā)言權(quán)(該項(xiàng)工作屬于訪問(wèn)決策管理器),但是它們?cè)谠L問(wèn)決策過(guò)程中扮演著重要的角色。一個(gè)訪問(wèn)決策投票者的工作是同時(shí)考慮用戶已擁有的授權(quán)和受保護(hù)資源配置屬性
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年大學(xué)衛(wèi)生統(tǒng)計(jì)學(xué)(衛(wèi)生統(tǒng)計(jì)方法)試題及答案
- 2025年高職計(jì)算機(jī)(網(wǎng)頁(yè)制作技術(shù))試題及答案
- 2025年大學(xué)二年級(jí)(環(huán)境工程)大氣污染治理階段試題及答案
- 2025年中職母嬰照護(hù)(產(chǎn)婦康復(fù)護(hù)理)試題及答案
- 2025年大學(xué)材料化學(xué)(材料化學(xué)技巧)試題及答案
- 2025年大學(xué)環(huán)境科學(xué)(生態(tài)環(huán)境治理)試題及答案
- 2025年中職汽車(汽車維護(hù)保養(yǎng))試題及答案
- 2025年大學(xué)(酒店管理)酒店運(yùn)營(yíng)管理綜合測(cè)試試題及答案
- 2025年中職軌道交通(車輛維護(hù)基礎(chǔ))試題及答案
- 2025年中職(幼兒保育)幼兒急救知識(shí)基礎(chǔ)階段測(cè)試題及答案
- 廣東省佛山市2024-2025學(xué)年高一上學(xué)期期末考試語(yǔ)文試題(解析版)
- 電工承包簡(jiǎn)單合同(2篇)
- 模切管理年終工作總結(jié)
- 售后工程師述職報(bào)告
- 粉刷安全晨會(huì)(班前會(huì))
- 2024年國(guó)網(wǎng)35條嚴(yán)重違章及其釋義解讀-知識(shí)培訓(xùn)
- 部編版八年級(jí)語(yǔ)文上冊(cè)課外文言文閱讀訓(xùn)練5篇()【含答案及譯文】
- 高三英語(yǔ)一輪復(fù)習(xí)人教版(2019)全七冊(cè)單元寫作主題匯 總目錄清單
- 工業(yè)區(qū)物業(yè)服務(wù)手冊(cè)
- 大學(xué)基礎(chǔ)課《大學(xué)物理(一)》期末考試試題-含答案
- 道德與法治五年級(jí)上冊(cè)練習(xí)測(cè)試題帶答案(模擬題)
評(píng)論
0/150
提交評(píng)論