springsecurity中文指南本后面部分提供對框架結(jié)構(gòu)和實現(xiàn)類深入討論了解它們你進行_第1頁
springsecurity中文指南本后面部分提供對框架結(jié)構(gòu)和實現(xiàn)類深入討論了解它們你進行_第2頁
springsecurity中文指南本后面部分提供對框架結(jié)構(gòu)和實現(xiàn)類深入討論了解它們你進行_第3頁
springsecurity中文指南本后面部分提供對框架結(jié)構(gòu)和實現(xiàn)類深入討論了解它們你進行_第4頁
springsecurity中文指南本后面部分提供對框架結(jié)構(gòu)和實現(xiàn)類深入討論了解它們你進行_第5頁
已閱讀5頁,還剩134頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

PartI.制是十分重要的。在這部分,介紹SpringSecurity3.0,簡要介紹該項目的歷個更加簡單的方式,在使用傳統(tǒng)的springbean配置時,你不得不實現(xiàn)所有類。你可以在對框架有了連接之后再回來看這些例子也請參考項目獲得構(gòu)建項Chapter1SpringSecuritySpringSecurityJ2EE的J2EE解決方案-springSpring開發(fā)企業(yè)軟件,我們熱情的推薦你仔細研究一下。熟悉Spring-尤其是依賴注入原理-將幫助你更快的掌握SpringSecurity。SpringSecurityJ2EEServletEJB的是它們不能在WAREAR在新的目標環(huán)境進行大量的工作,對你的應(yīng)用系統(tǒng)進行重新配置安全。使用SpringSecurity解決了這些問題,也為你提供了很多有用的,可定制的其他安全特性。Security面向的兩個主要方向。“認證”是為用戶建立一個他所的主體的過程,(“主體”一般是指用戶,設(shè)備或可以在你系統(tǒng)中執(zhí)行行動的其他系統(tǒng))。“驗證”指的一個用戶能否在你的應(yīng)用中執(zhí)行某個操作。在到達判斷之前,的主體已經(jīng)由驗證過程建立了。這些概念是通用的,不是SpringSecurity特有的。在驗證層面,SpringSecurity廣泛支持各種驗證模式。這些驗證模型絕大TaskSpringSecuritySpringSecurity目前支持認證和如下認證技術(shù):HTTPBASICauthenticationheaders一個基于IEFTRFC的標準HTTPDigestauthenticationheaders一個基于IEFTRFC的標準HTTP exchange一個基于IEFTRFC的標準LDAP一個非常常見的跨平臺認證需要做法,特別是在大環(huán)境Form-basedauthentication提供簡單用戶接口的需求OpenID(ComputerAssociatesJA-SIGCentralAuthenticationService(CAS,這是一個流行的TransparentauthenticationcontextpropagationforRemoteMethodInvocation(RMI)andHttpInvoker(一個Spring調(diào)用協(xié)議)(Run-asauthentication(這在一個會話內(nèi)使用不同安全的時候是非常有JavaAuthenticationandAuthorizationServiceJEEContainerautentication這樣,你可以繼續(xù)使用容器管理認證,如果想JavaOpenSourceSingleSignOn(JOSSO)OpenNMSNetwork tformAppFuseAndroMDAMuleESBDirectWebRequest(DWR)GrailsTapestryJTracJasyptRoller thAtlassianCrowd(*是指由第提供,查看我們的整合網(wǎng)頁,獲得詳情的。許多獨立軟件供應(yīng)商(ISVs,independentsoftwarevendors)采用SpringSecurity,是因為它擁有豐富靈活的驗證模型。這樣,無論終端用戶需要什么,他們都可以快速集成到系統(tǒng)中,不用花很多功夫,也不用讓用戶改變運行環(huán)境。如果上述SpringSecurity的許多企業(yè)用戶需要整合不遵循任何特定安全標準的“遺留”系統(tǒng),SpringSecurity在這類系統(tǒng)上也表現(xiàn)的很好。有時基本的認證是不夠的。有時你需要根據(jù)在主體和應(yīng)用交互的方式來應(yīng)用不同的安全措施。比如,你可能,為了保護,不被或受到中間人,希望確保請只通過HTTPS到達。這在防止保護恢復(fù)過程特別有幫助,或者簡單的,讓人難以你的系統(tǒng)的關(guān)鍵字內(nèi)容。為了幫助你實現(xiàn)這些目標,SpringSecurity完全支持自動“信道安全”,整合jcaptcha進行人類用戶檢測。SpringSecurity不僅提供認證功能,也提供了完備的功能。在方面主要有三個領(lǐng)域,web請求,被調(diào)用方法,單個對象的實例。為了幫你了和文件系統(tǒng)安全方面的方式。SpringSecurity在所有這些重要領(lǐng)域都提供了完““springspring的安全實現(xiàn)。2003sourceforgespring社區(qū)的2004年一月左右,有20人在使用這些代碼。另外一些人加入到這些先行者中來,并建議在sourceforge20043月正式建立起來。則注重。這在一開始是合適的,但隨著越來越多用戶要求提供額外的容器支持,classpath中添加新jar,常常讓最終用戶感到困惑,又容易出現(xiàn)配置錯誤。隨后acegi加入了認證服務(wù)。大約一年后,acegi成為spring的子項目。經(jīng)過了20065月。acegi2007年年底,正式成為spring組合項目,被更名為“SpringSecurity”現(xiàn)在,SpringSecurity成為了一個強大而又活躍的開源社區(qū)。在SpringSecurity支持上有成千上萬的信息。有一個積極的開發(fā)團隊專職開發(fā),一個積極的社了解springSecurity版本號是非常有用的它可以幫助你判斷升級到新的版本是apache便攜式運行項目版本指南,可以在以下網(wǎng)址查看。為了方便大家,我們頁“版本號是一個包含三個整數(shù)的組合:主要版本號.次要版本號.APISpring你可以通過多種方式獲得SpringSecurity。你可以打包好的包,從Spring的頁,單獨的jar(和實例WAR文件)從Maven SpringSourceMaven,獲得快照和里程碑發(fā)布)??蛇x的,你可以通過源代碼創(chuàng)建項目。參考項目獲得細節(jié)。在SpringSecurity3.0中,項目已經(jīng)分割成單獨的jar,這更清楚的按照功能進行分割模塊和第依賴。如果你在使用Maven來構(gòu)建你的項目,你需要把這些模塊添件,來了解第依賴和對應(yīng)的版本??蛇x的,一個好辦法是參考實例應(yīng)用中包含的Core-spring-security-包含了認證和權(quán)限控制類和接口,運程支持和基本供應(yīng)API。使用SpringWeb-spring-security-包含過濾器和對應(yīng)的webservletAPI如果你需要SpringSecurityWeb認證服務(wù)和基于URL的權(quán)限控制。主包是Config-spring-security-果使用了SpringSecurityXMLLDAP-spring-security-LDAP認證代碼如果你需要使用LDAP認證或管理LDAP用戶實體就是必須的。org.springframework.security.ldap。ACL-spring-security-處理領(lǐng)域?qū)ο驛CLorg.springframework.security.acls。CAS-spring-security-cas-CAS單點登錄服務(wù)器。頂級包是org.springframework.security.cas。OpenID-spring-security-OpenIDweb認證支持。用來認證用戶,通過一個外部的OpenID服務(wù)。。需要SpringSecuritysubversion樣你可以獲得所有的示例,你可以很容易的建立目前的項目。獲得項目的源代碼對調(diào)試也有很大的幫助。異常堆棧不再是模糊的黑盒問題,你可以直接找到發(fā)生問題的那一行,查找發(fā)生了什么額外難題。源代碼也是項目的最終文檔,常常是最簡單的要像獲得項目的源代碼,使用如下subversion命令 構(gòu),為傳統(tǒng)的springbeans應(yīng)用環(huán)境語法做補充。你可以在spring參考文檔得到更置語法,這可以更加緊密的匹配問題域,隱藏用戶背后的復(fù)雜性。簡單元素可能隱藏事實,多種bean和處理步驟添加到應(yīng)用環(huán)境中。比如,把下面的security命名元素添加到應(yīng)用環(huán)境中,將會為測試用途,在應(yīng)用內(nèi)部啟動一個內(nèi)嵌LDAP服務(wù)器:<security:ldap-server<security:ldap-serverApachebean要簡單得多。最常見的替代配置需求都可以ldap-server元素的屬性進行配置,這樣用戶就不用擔(dān)心他們需要設(shè)置什么,不用擔(dān)心bean[1]。使用一個良好的XMLSpringSource為它具有處理spring組合命名空間的特殊功能。要開始在你的應(yīng)用環(huán)境里使用security命名空間,你所需要的就是把架構(gòu)添加到<beansxmlns="d在許多例子里,你會看到(在示例中)應(yīng)用,我們通常使用"security"作為默認名空間,而不是"beans"security命名空間元素的前綴,使上下文更容易閱讀。如果你把應(yīng)用上下文分割成單獨的文件,讓你的安全配置都放到其中一個文件里,這樣更容易使用這種配置方法。你的安全應(yīng)用上下文應(yīng)該像這樣dWeb/HTTP-bean來應(yīng)用框架驗證機制,保護URL,渲染登錄和錯誤頁面還有。AuthenticationManager-AccessDecisionManager-提供的決定適用于web以及方法的安全。一個默認的主體會被,但是你也可以選擇自定義一個,使用正常的springbean語法進行。AuthenticationProviders-供幾種標準選項,意味著使用傳統(tǒng)語法添加自定義bean。UserDetailsService-密切相關(guān)的認證供應(yīng)器,但往往也需要由其他bean在本節(jié)中,我們來看看如何使用一些框架里的主要配置,建立一個命名空間配置。我web應(yīng)用添加認證支持和權(quán)限控制,使以后的章節(jié)里引入高級名空間配置選項。我們要做的第一件事是把下面的filter添加到web.xml文件中>>這是為SpringSecurity的web機制提供了一個調(diào)用鉤子。DelegatingFilter是一個SpringFramework的類,它可以一個applicationcontext中定義的Springbean所實現(xiàn)的filter。這種情況下,bean的機制。注意,你不應(yīng)該自己使用這個bean的名字。一旦你把這個添加到你的web.xml中,你就準備好開始編輯呢的applicationcontextweb安全服務(wù)<http><http<httpauto-<intercept-urlpattern="/**"access="ROLE_USER"這表示,我們要保護應(yīng)用程序中的所有URLROLE_USER角色的用戶才能訪問。<http>元素是所有web相關(guān)名空間功能的上級元素。<intercept-url>元性定義了請求匹配了指定模式時的需求。使用默認的配置,這個一般是一個逗號分隔的角色隊列,一個用戶中的一個必須被允許請求。前綴“ROLE_”表示的是一個用SpringSecurity中的控制不限于簡單角色的應(yīng)用(因此,我們使用不同的前綴來區(qū)分不同的安全屬性).我們會在后面看到這些解釋是可變的[2]會被歸入一個有序隊列中,每次取出最先匹配的一個元素使用。所以你必須把期望使用的匹配條件放到最上邊。你也可以添加一個method屬性來限制匹配一個特定的HTTPmethod(GET,POST,PUT等等)。對于一個模式同時定義在定義了method和未定義method的情況,指定method的匹配會無視順序優(yōu)先被使用。要是想添加一些用戶,你可以直接使用下面名空間直接定義一些測試數(shù)據(jù)="ROLE_USER,ROLE_ADMIN" ="ROLE_USER"<http>元素會創(chuàng)FilterChain和filterbeanfilter<authentication-provider>元素創(chuàng)建了一個DaoAuthenticationProviderbean,<user-service>元素創(chuàng)建了一個InMemoryDaoImpl。所有authentication-provider元素必須作為<authentication-manager>的子元素,它創(chuàng)建了一個ProviderManager,并把authenticationprovider 到它里面。你可以在命名空間附錄中找到關(guān)于創(chuàng)建這個bean的更新信息。很值得去交叉檢查一下這里,如果你希望開始理解框?qū)傩浴⒖糹n-memoryauthentication獲得信息。使現(xiàn)在,你可以啟動程序,然后就會進入登錄流程了。試試這個,或者試試工程里的“tutorial例子。上述配置實際上把很多服務(wù)添加到了程序里,因為我們使用了auto-config屬性。比如,表單登錄和"remember-me"服務(wù)自動啟動了。<form-login<http-basic<http-basic<logoutform-login[3]他們擁有各自的屬性,到任何的HTML或JSP文件。實際上,如果我們沒有確切的指定一個頁面用來登錄,SpringSecurityURL使用標準的數(shù)據(jù),URL。然而,命名空間提供了許多<http<httpauto-<intercept-urlpattern="/**"access="ROLE_USER"<form-loginlogin-些URL應(yīng)該可以被。[4]否則,這些請求會被/**部分,它沒法到登會在日志中發(fā)出一個警告,如果你的登錄頁面是被保護的。也可能讓所有的請求都匹<http<httpauto-<intercept-url<intercept-urlpattern="/css/**"<intercept-urlpattern="/login.jsp*"<intercept-urlpattern="/**"access="ROLE_USER"<form-loginlogin-主要的是這些請求會被完全忽略對任何SpringSecurity中web相關(guān)的配置,或額外的屬性,比如requires-channel,所以你會不能當(dāng)前用戶信息,或調(diào)用access='IS_AUTHENTICATED_ANONYMOUSLY'作為一個如果你還想要安全過濾器鏈起作用。<http<httpauto-<intercept-urlpattern="/**"access="ROLE_USER"<http-basic基本認證會被優(yōu)先用到在用戶嘗試一個受保護的資源時用來提示用戶登錄。就會起作用。這是用戶登陸后會跳轉(zhuǎn)到的URL,默認是。你也可以把"true"論登陸是“跳轉(zhuǎn)過來的”還是用戶特定進行登陸)。如果你的系統(tǒng)一直需要用戶從首頁<intercept-urlpattern='/login.htm*'<intercept-urlpattern='/**'access='ROLE_USER'always-use-default-target='true'現(xiàn)實中,你會需要更大型的用戶信息源,而不是寫在applicationcontext里的幾個名LDAPLDAP命名空間會在LDAPSpringSecurity的UserDetailsService實現(xiàn),在你的applicationcontext中名叫<jdbc-user-service<jdbc-user-servicedata-source-這里的“securityDataSource”DataSourcebean在applicationcontext里的SecurityJdbcDaoImplbeanuser-service-ref屬性指定:<beans:bean<beans:propertyname="dataSource"AuthenticationProvider<authentication-provider<authentication-providermyAuthenticationProvider是你的applicationcontext中的一個bean的名AuthenticationProvider。查看Section2.6驗證管理器和命名空間”了解信息,AuthenticationManager使用命名空間在SpringSecurity中是添加一個你的數(shù)據(jù)通常要使用一種散列算法進行編碼。使用<password-encoder>元素支持這個功能。使用SHA加密,原始的認證供應(yīng)器配置,看起來就像這樣:<password-encoder="ROLE_USER,ROLE_ADMIN" ="ROLE_USER"能。理想情況下,你可能想為每個用戶隨機生成一個鹽值,不過,你可以使用從<password-encoder<password-encoder<salt-sourceuser-applicationcontextbeanSpringSecurity的PasswordEncoder接口的一個實例。Remember-Me章獲得remember-me如果你的同時支持HTTP和HTTPS協(xié)議,然后你要求特定的URL只能使用HTTPS,這時可以直接使用<intercept-url>requires-channel屬性:使用了這個配置以后,如果用戶通過HTTP嘗試"/secure/**"匹配的,他們會先被重定向到HTTPS下??捎玫倪x項有"http","https"或"any"。使用"any"意味著使用HTTP或HTTPS都可以。如果你的程序使用的不是HTTP或HTTPS的標準端口,你可以用下面的方式指定端口http="9080"你可以配置SpringSecurity檢測失效的sessionID,并把用戶轉(zhuǎn)發(fā)到對應(yīng)的URL。這可以通過session-management<http>session-managementinvalid-session-url="/sessionTimeout.htm"/></http>web.xml文件里,SpringSecuritysession生存周期:<listener><listener-class></listener-class>listener>然后,在你的applicationcontext<concurrency-controlmax-sessions="1"這將防止一個用戶重復(fù)登錄好幾次-um-exceeded="true"第二次登錄將被,通過“注入”,我們的意思是用戶會被轉(zhuǎn)發(fā)到用了其他非內(nèi)置的機制,比如“remember-me”,一個“未認證”(402)錯誤就會發(fā)送加session-authentication-error-url屬性。如果你為form-based多的細節(jié)可以在會話管理章節(jié)找到。Session固定是一個潛在,當(dāng)一個者可以創(chuàng)建一個session一了session標識參數(shù)的)。SpringSecurity通過在用戶登錄時,創(chuàng)建一個新session來防止這個問題。如果你不需要保護,或者它與其他一些需求,你可以migrateSession-sessionsession中所有屬性復(fù)制到新session中。這是默認值。none-什么也不做,繼續(xù)使用原來的sessionnewSession-創(chuàng)建一個新的“干凈的”session,不會session中的數(shù)OpenID登錄,替代普通的表單登錄,或作為一種附加功能,只需要進<intercept-urlpattern="/**"access="ROLE_USER"<openid-login你應(yīng)該一個OpenID供應(yīng)器(比如 name="="ROLE_USER"你應(yīng)該可以使用 登錄來進行驗證了。也可能選擇一個特定的UserDetailsServicebean來使用OpenID,通過設(shè)置元素。查看上一節(jié)認證提供器獲得信息。請注意,上面用戶配置中我們省略了屬性,因為這里的用戶數(shù)據(jù)只用來為數(shù)據(jù)數(shù)據(jù)。內(nèi)部會生成一個隨碼,放置我們使用用戶數(shù)據(jù)時出現(xiàn)問題,無論在你的配置的地方使用認證信息。屬支持OpenID的屬換。作為一個例子,下面的配置會嘗試從OpenID提供器中獲得和全名,這些會被應(yīng)用程序使用到:""required="true""OpenID的“type”URIschema子中是。如果一個屬性必須為了成功認證而獲取,可以設(shè)置requiredschemaOpenID提供器。屬性值作為認證過程的一部分返回,可以使用下面的代碼在后面的過程中獲得:OpenIDAuthenticationTokenOpenIDAuthenticationTokentoken=(OpenIDAuthenticationToken)List<OpenIDAttribute>attributes=token.getAttributes();們將看到關(guān)于SecurityContextHolder如何使用的信息,只要我們在技術(shù)概述章節(jié)瀏覽SpringSecurity組件。如果你以前使用過SpringSecurity,你就應(yīng)該知道這個框架里了一個過濾器鏈,來提供服務(wù)。你也許想自己的過濾器添加到鏈條的特定位置,或者使用一個SpringSecurity的過濾器,這個過濾器現(xiàn)在還沒有在命名空間配置中進行支持(比如CAS)。或者你想要使用一個特定版本的標準命名空間過濾器,比如<form-login>過濾器順序在使用命名空間的時候是被嚴格執(zhí)行的。當(dāng)applicationcontext創(chuàng)建時,beannamespacespringsecurity過濾器都有自己的假名和一個容易的位置。applicationcontext的執(zhí)之前。這會影響到你如何添加自己的過濾器,實體過濾器列表必須在解析<http>元3.0中的語法變化的很明顯。假名和順序”中找到。過濾器按照次序排列在過濾器鏈中。Table2.1http/form-http/http-session-你可以自己的過濾器添加到隊列中,使用custom-filter元素,使用這些名字中<custom-filterposition="FORM_LOGIN_FILTER"你還可以使用after或before屬性,如果你想的過濾器添加到隊列中另一個過position屬性使用"FIRST"LAST"來指定你想器放在同一個位置上,這樣首要的是你不要錯誤包含命名空間的版本信息。避免使用auto-config屬性,然后刪除所有會創(chuàng)建你希望替換的過濾器的元素。<http>SecurityContextPersistenceFilter,ExceptionTranslationFilter或一個自定義的點bean。AuthenticationEntryPoint可以使用<http>元素中的entry-point-ref屬性來進行設(shè)置。CAS示例程序是一個在命名空間中使用自定義bean2.0開始SpringSecurityJSR-250安全注解的支持,這與框架提供的@secured3.0開始,你也可以使用新的基于表達式的注解。你可以提供安全給單個bean,使用intercept-methods來裝飾bean的,或者你可以控制多個bean,通過實體服務(wù)層,使用AspectJ演示的切點功能。應(yīng)該只定義一個<global-method-security>元素。下面的同時啟用SpringSecurity的@Secured和JSR-250注解:向一個方法(或一個類或一個接口)添加注解,會限制對這個方法的。SpringpublicpublicinterfaceBankServicepublicAccountreadAccount(LongpublicAccount[] publicAccountpost(Accountaccount,double}<global-method-security<global-method-securitypre-post-annotations="enabled"publicpublicinterfaceBankServicepublicAccountreadAccount(Longid);publicAccount[]findAccounts(); publicAccountpost(Accountaccount,double}protect-pointcut是非常強大的,它讓你可以用簡單的對多個bean的進行安全。參考下面的例子:這樣會保護applicationcontext中的符合條件的bean的所有方法,這些beanURL匹配一樣,指定的匹配要放在切點隊列的最前面,第一個匹配的表達式才會這章假設(shè)你有一些SpringSecurity來為方法調(diào)用和webURL做驗證,這些都是基于你設(shè)置的intercept-url和protect-pointcut權(quán)限屬性內(nèi)容(和注解中的內(nèi)容,如果你使用注解控制方法的權(quán)默認的策略是使用一個AffirmativeBasedAccessDecisionManager,以及RoleVoter和AuthenticatedVoter。可以在authorization中獲得信息AccessDecisionManagerbean在applicationcontext里的主要接口提供了驗證服務(wù)在SpringSecurity中,是AuthenticationManager。通常是SpringSecurity中ProviderManager類的一個實例,如果你以前使用過框架,你可能已經(jīng)很熟悉了。 如果沒有,它會在稍后被提及,在#tech-intro-authentication。bean實例被使用authentication-manager命名空間元素。你不能好似用一個自定義的AuthenticationManager如果你使用HTTp或方法安全,在命名空間中,但是它不應(yīng)該是一個問題,因為你完全控制了使用的AuthenticationProvider。<authentication-provider>ref是你希望添加的provider的bean的名字,比如:<authentication-provider<beanbean在applicationcontext的其他地方使用這個名字。<bean<bean項目中包含了很多web實例程序。為了不讓包變得太大,我們只把"tutorial"和"contacts"兩個例子放到了zipMaven里獲得單獨的war文件。我們建議你使用前法。你可以按照簡介里的介紹獲得源代碼,使用maven上找到信息這個tutorial示例是帶你的很好的一個基礎(chǔ)例子。它完全使用了簡單命名空間配置。編譯好的應(yīng)用就放在zip發(fā)布包中,已經(jīng)準備好發(fā)布到你的web容器中(spring-security-samples-tutorial-2.0.x.war)form-based驗證機制,與常用的remember-me驗證提供器相結(jié)合,自動使用記錄登錄信息。Contacts例子,是一個很高級的例子,它在基本程序安全上附加了領(lǐng)域?qū)ο蟮目刂屏斜?,演示了強大的功能。要發(fā)布它,先把SpringSecurity發(fā)布中的war文件按到你的容器的webapps目2.0.0.wa(在啟動你的容器之后,檢測一下程序是不是加載了,(或是其他你把warweb容器(的URL)下一步,點擊"Debug"和。隨便使用其中的一個通過認證,就會看到結(jié)果頁面。它應(yīng)該會包含下面這樣SecurityDebugInformationAuthenticationobjectisoftype:AuthenticationobjectasaPrincipal:org.springframework.security.core.userdetails.User@b07ed00:Username:rod;\Password:[PROTECTED];Enabled:true;AccountNonExpired:true;credentialsNonExpired:true;AccountNonLocked:true;\ :ROLE_SUPERVISOR,ROLE_USER;Password:[PROTECTED];Authenticated:true;Details:org.springframework.security.web.authentication.WebAuthenticationDetails@0:\RemoteIpAddress:;SessionId:8fkp8t83ohar;\ :ROLE_SUPERVISOR,ROLE_USERAuthenticationobjectholdsthefollowinggranted ROLE_SUPERVISOR(getAuthority():ROLE_SUPERVISOR)ROLE_USER(getAuthority():Success!Yourwebfiltersappeartobeproperly一旦你成功的看到了上面的信息,就可以返回例子程序的主頁,點擊"Manage"而且只有ROLE_SUPERVISOR權(quán)限的用戶可以刪除他們的聯(lián)系信息。在這場景后面,MethodSecurityInterceptor保護著業(yè)務(wù)對象。陳程序允許你修改控制列表,分配不同的。確保自己好好試用過,看看程序里的上下文XML文件,搞明白它是如何運行的。applicationcontextCAS示例要求你同時運行CAS服務(wù)器和CAS客戶端。它沒有包含在發(fā)布包里,你應(yīng)該使用簡介中的介紹來獲得源代碼。你可以在sample/cas 里還有一個Readme.txt文件,解釋如何從源代碼樹中直接運行服務(wù)器和客戶端,提供完全的SSL支持。你應(yīng)該CAS服務(wù)器web程序(一個war文件)從CAS,把它放到samples/cas/server pre-authenticationbeanJ2EE容器中獲得有用的登錄信息。用戶名和角色是由容器設(shè)置的。代碼在 下SpringSecuritySpringSecurity使用JIRA管理bug報告和擴充請求。如果你發(fā)現(xiàn)一個bug,請使用JIRA提交一個報告。它放到支持上,郵件列表里,或者直接發(fā)郵件給項bug。Junit或者,更好的是,提供一個不定來修正這個問題。一般來說,擴充也也可以提交到任務(wù)系統(tǒng)里,雖然我們只接受提供了對應(yīng)的單元測試的擴充請求。因為保證項目的你可以任務(wù)的我們歡迎你加入到SpringSecuritySpringSecuritySpring同框架的其他用戶討論SpringSecurity使用JIRA提交bug,這部分在上面提到過了。PartII結(jié)構(gòu)當(dāng)你熟悉了如何設(shè)置和使用基于命名空間配置的應(yīng)用,你也許希望了解關(guān)于框架SpringSecurity有一系列的接口,類和抽象概念,貫穿整個框架。在指南的這個部分,我們會觀察它們是如何在一起工作的,同SpringSecurity支持驗證和權(quán)限控制。SpringSecurity3.0需要運行在Java5.0或更高版本環(huán)境上。因為SpringSecurityJava運行環(huán)境進行什么特別的配置。特別是,不需要特別配置一個JavaAuthenticationandAuthorizationServiceJAAS)政策文件,也不需要把SpringSecurity放到server的classLoaderEJB容器或者是Servlet置文件放到什么地方,也不需要把SpringSecurity放到server的classloader下。這些設(shè)計確保了發(fā)布時的最大輕便性,你可以簡單的目標文件(JAR或WAREAR)從一個系統(tǒng)到另一個系統(tǒng),它會立即正常工作5.2.組在SpringSecurity3.0中,spring-security-corejar它不再包含任何與webLDAP看看你在模塊中找到的Java類型它們展示了框架的構(gòu)建基礎(chǔ),所以如果你需要簡單名空間配置,那么理解它們就是很重要的即便你不需要直接操作他們。 細節(jié)到它里邊了,它也包含了應(yīng)用當(dāng)前使用的主體細節(jié)。默認情況下,同一個線程執(zhí)行的方法一直是有效的,即使這個安全環(huán)境沒有作為一個方法參數(shù)傳遞ThreadLocalSpringSecurity自動幫你管理這一切了,你就不用擔(dān)心什么了。有些程序并不適合使用ThreadLocal,因為它們處理線程的特殊方法。比如,swing客戶端也許希望 里的所有線程都使用同一個安全環(huán)境。SecurityContextHolder可以使用一個策略進行配置在啟動時指定你想讓上下文怎樣被保存。對于一個單獨的應(yīng)用系統(tǒng),你可以使用SecurityContextHolder.MODE_GLOBAL策略。其他程序可能想讓一個線程創(chuàng)建的程也使用相同的安全主體。這時可以使用SecurityContextHolder.MODE_INHERITABLETHREADLOCALSecurityContextHolder.MODE_THREADLOCALSecurityContextHolder要修改默認值,但是如果你需要做修改,先看一下SecurityContextHolder的JavaDoc中的詳細信息。我們把安全主體和系統(tǒng)交互的信息都保存在SecurityContextHolderSpringSecurityAuthenticationAuthenticationAuthentication對象。--=if(principalinstanceofUserDetails)Stringusername=}elseStringusername=}返回的對象是一個UserDetails的實例作為主體。Authentication對象中獲得UserDetails對象。UserDetails是一個SpringSecurity的接口。它代表一個主體,是擴UserDetails章節(jié),在你自己的用戶數(shù)據(jù)庫和如何把SpringSecuritySecurityContextHolder里。為了讓你自己的用戶數(shù)據(jù)庫起作用,我們常常把UserDetails轉(zhuǎn)換成你系統(tǒng)提供的類,這樣你就可以直接調(diào)用業(yè)務(wù)相關(guān)的方法了(get()getEmployeeNumber()等等)你說這個東西是式的,我不需要寫任何代碼,怎么辦?簡單的回答是,這有一個特殊的接口,叫UserDetailsService。String這是獲得從SpringSecurity被用到。當(dāng)需要獲得一個用戶的信息的時候。當(dāng)成功通過驗證時,UserDetails會被用來建立Authentication對象,保存在SecurityContextHolder里。(更多的信息可以參考下面的#tech-intro-authentication-mgr)。好消息是我們提供了好幾個UserDetailsServicemap(InMemoryDaoImpl)另一個而是用了JDBC(JdbcDaoImpl)UserDetailsService返回的數(shù)據(jù)都可以通過SecurityContextHolder獲得,就像上面的代碼片段講的一樣。除了主體,另一個Authentication提供的重要方法是get ()。這個方體的權(quán)限。這些權(quán)限通常使用角色表示,比如ROLE_ADMINISTRATOR或ROLE_HR_SUPERVISOR。這些角色會在后面,對web驗證,方法驗證和領(lǐng)域?qū)ο篁炞C進行配置。SpringSecurity的其他部分用來這些權(quán)限,期望他們被表現(xiàn)出現(xiàn)。GrantedAuthority對象通常使用UserDetailsService的。通常情況下,GrantedAuthority對象是應(yīng)用程序范圍下的。它們不會特意分配GrantedAuthority,讓它有權(quán)限展者,至少,導(dǎo)致程序花費大量時間去驗證一個用戶)SpringSecurity被明簡單回顧一下,SpringSecuritySecurityContextHolder,提供幾種SecurityContext的方式HttpSessionContextIntegrationFilterSecurityContext保存到HttpSession里。AuthenticationSpringSecurityUserDetailsDAOUserDetailsServiceUserDetailsString類型的用戶名(或者ID或其他)。SpringSecurity可以用在多種不同的驗證環(huán)境下。我們推薦人們使用SpringSecurity的-作為與你自己的驗證系統(tǒng)相整合的式。系統(tǒng)(成功的)驗證了對于這個用戶名是正確的(他們的角色列表以及等等)作的,使用當(dāng)前的安全環(huán)境信息。SpringSecurity用戶名和被獲得,并進行比對,在一個UsernamePasswordAuthenticationToken的實例中(它是Authentication接口的一個實例,我們在之前已經(jīng)見過了)。AuthenticationManager安全環(huán)境被建立,通過調(diào)用importimportorg.springframework.security.authentication.*;importorg.springframework.security.core.*;;publicclassAuthenticationExample publicstaticvoidmain(String[]args)throwsException while(true)System.out.println("PleaseenteryourStringname=System.out.println("PleaseenteryourStringpassword=try Authenticationresult=}catch(AuthenticationExceptione) }} contextcontains:"}} AuthenticationManager static.add(new}}publicAuthenticationauthenticate(Authenticationauth)AuthenticationExceptionif(auth.getName().equals(auth.getCredentials()))}thrownew ception("Bad}}這里我們寫了一些程序,詢問用戶輸入一個用戶名和,然后執(zhí)行上面的順序。我們實現(xiàn)的AuthenticationManager會驗證所有用戶名和一樣的用戶。它為每個永固分配一個單獨的角色。上面輸出的信息將會像這樣:PleasePleaseenteryourusername:Pleaseenteryourpassword:Authenticationfailed:BadCredentialsPleaseenteryourusername:PleaseenteryourSuccessfullyauthenticated.Securitycontextcontains:henticationToken@441d0230:Principal:bob;Password:[PROTECTED];\Authenticated:true;Details:null;\:web驗證過濾SpringSecurity提供了一個簡單的答案。一個用戶被驗證,當(dāng)SecurityContextHolder包含了完整的Authentiation對象。實際上,SpringSecurityAuthenticationAuthenticationSecurityInterceptor之前(我們以后會看到)需要驗證一個用戶操作。SpringSecurityTheadLocalJNDISpringSecurity(或什么設(shè)備)從一個地方第用戶信息,構(gòu)建一個SpringSecurity特定的AuthenticationSecurityContextHolder里。AuthenticationManager***現(xiàn)在讓我們研究一下情景,當(dāng)我們在web應(yīng)用中使用SpringSecurity(web.xml安全)考慮一個典型的web應(yīng)用的驗證過程:你主頁,點擊個HTTP響應(yīng)代碼,或重定向到特定的web頁面。web寫表單,或者瀏覽器會驗證你的(通過一個BASIC驗證框,一個,一個X.509驗證,等等)。瀏覽器會發(fā)送回一個響應(yīng)到服務(wù)器。這會是一個HTTPPOST包含你填寫的表單中的內(nèi)容,或者一個HTTP頭部包含你的驗證細節(jié)。(initial返回上兩你的原始請求會驗證過程。希望你驗證了獲得了授予的權(quán)限來被保護的資源。如果你完允許請求會成功。否則你會收到一個HTTP錯誤代碼403,意思是“ SpringSecurity(使用的次序)ExceptionTranslationFilterAuthenticationEntryPoint和一個“驗證機制”AuthenticationManager的調(diào)用我們在上一章見過。ExceptionTranslationFilter是一個SpringSecurity過濾器負責(zé)檢測任何一個SpringSecurity拋出的異常。這些異常會被 SecurityInterceptor拋出,這是一個驗證服務(wù)的主要提供器。我們會在下一章討論SecurityInterceptorJava個服務(wù),特別負責(zé)返回錯誤代碼403(如果主體已經(jīng)通過,但是權(quán)限不足-像上面的第七步),或者啟動一個AuthenticationEntryPoint(如果主體還沒有授AuthenticationEntryPointweb應(yīng)用會)AuthenticationEntryPoint實現(xiàn),典型的執(zhí)行一個動作,描述在第三步。一旦你的瀏覽器提交了你的驗證(像HTTP表單POST或者HTTP頭)這些需要一些服務(wù)器的東西保存這些權(quán)限信息。但是現(xiàn)在我們進入上面的第六步。在SpringSecurity(通常是瀏覽器),它作為一個“驗證機制”。例子是基于表單的登錄和BASIC驗證。一旦驗證細節(jié)被從用戶處收集到,一個Authentication請求對象就會被建立,AuthenticationManager。SecurityContextHolder(上面第七步)。如果,其他可能,AuthenticationManager了請求,請求機制會讓用戶重試(上面應(yīng)用中,一個用戶日志,一次或順序被它的sessionid。服務(wù)器緩存主體信息在session整個過程中,在SpringSecurity中,保存SecurityContext,從請求失敗,默認保存到HTTPSecurityContextHolder,為每個請求。然后為每個請求清空SecurityContextHolder。你不應(yīng)該為了安全目的,直接操作HttpSession-SecurityContextHolder很多其他類型的應(yīng)用(RESTweb服務(wù))HTTP會話,重要,確保包含在SecurityContextHolder中,在每次請求后清空。,然后Authentication實例。你可以自定義為來創(chuàng)建完全新的一個線程避免影響其他的。還可以選擇的是,你可以創(chuàng)建一個新實例,只在你暫時修改上下文的時候。這個方法主要接口,負責(zé)控制的決定,在SpringSecurity中是隊列,為對象提供了(比如一個角色列表,為被授予的請求)。如果你熟悉AOP的話,就會知道有幾種不同的方式:之前,之后,拋異常和環(huán)繞。其繞是非常有用的,因為advisor可以決定是否執(zhí)行這個方法,是否修改返回的結(jié)SpringSecurity為方法調(diào)用提供了一個環(huán)繞adviceweb請求一樣。我們使用Spring的標準AOP支持制作了一個處理方法調(diào)用的環(huán)繞advice,我們使用標準filter建立了對web請求的環(huán)繞advice。對那些不熟悉AOP的人,需要理解的關(guān)鍵問題是SpringSecurity可以幫助你保護方法的調(diào)用就像保護web請求一樣。大多數(shù)人對保護服務(wù)層里的安全方法非常按。這是因為在目前這一代J2EE程序里,服務(wù)器放了業(yè)務(wù)相關(guān)的邏輯(需要澄清,作者不建議這種設(shè)計方法,作為替代的,而是應(yīng)該使用DTO,,門面和透明持久模論它)。如果你只是需要保護服務(wù)層的方法調(diào)用,SpringAOP平臺(一般被稱作AOP)就夠了。如果你想直接保護領(lǐng)域?qū)ο?,你會發(fā)現(xiàn)AspectJ非常值得考AspectJSpringAOPfilterweb的應(yīng)用是處理一些web請求驗證,再結(jié)合一些在服務(wù)層里的SpringAOP方法調(diào)用驗 所以,什么是“secureobject”SpringSecurity使用應(yīng)用任何對象,可以被安全控制(比如一個驗證決定)提供到它上面。最常見的例子是方法調(diào)用和web請求。SpringSecurity支持的每個安全對象類型都有它自己的類型,它們都是 SecurityInterceptor被調(diào)用的時候,SecurityContextHolder將會包含一個有效的Authentication。SecurityInterceptor把安全對象,當(dāng)前的AuthenticationAuthentication允許安全對象進行處理(假設(shè)被允許了)一個"配置屬性"可以看做是一個字符串,它對于SecurityInterceptor使用的類是有特殊含義的。它們通過框架中的ConfigAttribute接口表現(xiàn)。它們可能是簡單的角色名稱或擁有更復(fù)雜的含義這就與AccessDecisionManager實現(xiàn)的先進程度有關(guān)了。 SecurityInterceptor和配置在一起的屬性。比如,當(dāng)我們查看一些像<intercept-urlpattern='/secure/**'access='ROLE_A,ROLE_B'/>在命名空間介紹里,這就是在說這些配置屬性ROLE_A和ROLE_B應(yīng)用到web請求匹配到指定的模式中。實際上,使用默認的AccessDecisionManager配置,這意味著任何人擁有GrantedAuthority匹配任何這些兩個屬性中的一個會被允許。嚴格意義上,他們只是樹形,解釋是基于AccessDecisionManager實現(xiàn)的。前綴ROLE_的使用標記了這些屬性是角色,會被SpringSecurity的RoleVoter處理。它只與基于角色的AccessDecisionManager有關(guān)。我們會在驗證章節(jié)看到AccessDecisionManager是如何實現(xiàn)的。假設(shè)AccessDecisionManager決定允許執(zhí)行這個請求SecurityInterceptor會正常執(zhí)行這個請求。話雖如此,罕見情況下,用通過RunAsManager。這也許在,有原因,不常見的情況下有用,比如,服務(wù)層方法需要調(diào)用系統(tǒng),表現(xiàn)不同的。因為SpringSecurity自動安全從一個服務(wù)器到另一(假設(shè)你使用了配置好的RMI或者HttpInvoker調(diào)用協(xié)議 SecurityInterceptor對有可能修改返回對象感。你可能想讓它發(fā)生,因為驗證決定不能“關(guān)于如何在”一個安全對象調(diào)用。高可插拔性,SecurityInterceptor通過控制AfterInvocationManager實際上在需要SecurityInterceptor和相關(guān)對象展示在Figure5.1關(guān)鍵"secureFigure5.1關(guān)鍵"secureobject"只有開發(fā)者才會關(guān)心使用全心的方法進行和驗證請求將直接使用安全方法。比如,可能新建一個安全方法,控制對消息系統(tǒng)的權(quán)限。安全需要的任何事情,也可以提供一種的方法(好像AOP的環(huán)繞advice語法那樣)有可能在安全對象里處理。這樣說的話,大多數(shù)Spring應(yīng)用簡單擁有三種當(dāng)前支持的安全類型(AOP的MethodInvocation,AspectJJoinPoint和webFilterInterceptor)完全透SpringSecurity支持異常信息的,最終用戶希望看到這些信息。如果你的應(yīng)用被設(shè)計成給講英語的用戶的,你不需要做任何事情,因為默認情況下SpringSecurity的信息都是的。如果你需要支持其他語言。你所需要做的事情都包含在所有的異常信息都支際化,包括驗證失敗和被的相關(guān)信息(失敗)。應(yīng)該被開發(fā)者和系統(tǒng)開發(fā)者關(guān)注(包括不正確的屬性,接口契約,使用構(gòu)造方法,開始時間校驗,調(diào)試級日志等等)的異常和日志沒有被,而是使用英語硬編碼到SpringSecurity的代碼中。從spring-security-core-xx.jar中,你可以找到包下,包含了一些這應(yīng)該到你的ApplicationContext中,因為SpringSecurity的類都實現(xiàn)了springMessageSourceAwareapplicationcontextapplicationcontext中一個bean來這些信息。下面是一個例子:<bean<bean用的默認語言的信息。默認的文件是英文的。如果你沒有一個信息源,SpringSecurity也會正常工作,并使用硬編碼的英文版本的信息。如果你想自定義perties文件,或者支持其他語言,你需要這個文件,正確的把它重新命名,再把它到bean定義中。這個文件中并沒有太多的信息。所以應(yīng)該不是很繁重的工作。如果你了這個文件,請考慮一下把你的工作和社區(qū)通過記錄一個JIRA任務(wù)翻譯的perties版 org.springframework.context.i18n.LocaleContextHolder。 你應(yīng)該把LocaleContextHolder設(shè)置成為每個用戶對應(yīng)的Locale。SpringSecurity會嘗試從信息源中尋找信息,根據(jù)ThreadLocal中獲得的Locale。請參考Spring的文檔,來獲得使用LocaleContextHolder的信息。Chapter6.服現(xiàn)在,我們對SpringSecurity的架構(gòu)和類有了次的了解了,讓我們近距離看看這些接口和他們的實現(xiàn),特別是AuthenticationManager,UserDetailsServiceAccessDecisionManagerTheAuthenticationManager,ProviderManager是實際上它是如何工作的呢?如果我們需要檢查多個數(shù)據(jù)庫或者將不同的服務(wù)結(jié)合起來,比如數(shù)據(jù)庫和lDAP服務(wù)器?在SpringSecurity中的默認實現(xiàn)是ProviderManager不只是處理請求自己它AuthenticationProviderAuthentication對象。要到前面的章節(jié)刷新一下你的。最常用的方式是驗證一個請求對應(yīng)的UserDetails,并檢查用戶錄入的。這是通過DaoAuthenticationProvider實你可以使用命名空間驗證元素,或給一個bean添加一個<custom-authentication-provider>元素。(參考命名空間章節(jié))。在這里,你不應(yīng)該在你的applicationcontext中一個ProviderManagerbean。然而,如果你沒有使用命名空間,你應(yīng)該像下面這樣進行:<bean<bean<property<ref<ref<ref<ref應(yīng)器能夠嘗試進行,或通過返回null跳過。如果所有的實現(xiàn)都返回null。ProviderManagerProviderNotFoundException供應(yīng)器感,請參考ProviderManager的javadoc。們的認證請求。你需要的供應(yīng)器有時需要被認證機制內(nèi)部改變的,當(dāng)在其他時候,他DaoAuthenticationProvider和LdapAuthenticationProvider可疑對應(yīng)任何一個提交簡單username/password截。一個例子就是JA-SIGCAS,它使用一個提醒的服務(wù)票據(jù),所以只可以被CasAuthenticationProvider合適的供應(yīng)器,你會得到一個ProviderNotFoundException當(dāng)這個驗證嘗試起作用springsecurity中最簡單的AuthenticationProvider實現(xiàn)是DaoAuthenticationProvider,這也是框架中最早支持的功能之一。它是UserDetailsService的杠桿(DAO),username,password和GrantedAuthority。它認證用戶,通過簡單比較,在息。配置供應(yīng)器十分簡單:<bean<bean<property<propertyname="userDetailsService"<propertyname="saltSource"ref<propertyname="passwordEncoder"PasswordEncoderSaltSourcePasswordEncoder提供了編碼和,在UserDetails對象中,被返回自配置好的UserDetailsService。一個SaltSource可以讓使用"鹽值"生成,這可以提高倉庫中的安全性。的細節(jié)會在下面進行討論。像面提及的一樣,大多數(shù)認證供應(yīng)器都是用了UserDetailsUserDetailsServiceUserDetailsServiceUserDetails是一個接口,它提供了獲得保證非空的認證信息,比如用戶名,,授予的權(quán)限和用戶賬號是可用還是禁用。大多數(shù)認證供應(yīng)器會使用UserDetailsService,即使username和password沒有實際用在這個認證決策中。UserDetails對象,獲得它的GrantedAuthority信息,因為一些其他系統(tǒng)(比如LDAP或者X.509或CAS等等)了解真實驗證的作用。SpringSecurity包含了很多有用的基本實現(xiàn),獲得信息,但是許多應(yīng)用沒有那么復(fù)雜。尤其是如果你建立一個原型應(yīng)用或只是SpringSecurity的時候,當(dāng)我們不是真的需要耗費時間配置數(shù)據(jù)庫或者寫UserDetailsService的user-service元素:<user-service<user-service="ROLE_USER,ROLE_ADMIN"="ROLE_USER"SpringSecurityUserDetailsService,它包含從一個JDBC數(shù)據(jù)源中獲得認證信息。了SpringJDBC,所以它避免了負責(zé)的功能完全的對象關(guān)系映射(ORM)ORM寫一個自己的UserDetailsService重用你已經(jīng)創(chuàng)建了的映射文件。返回到JdbcDaoImpl,一個配置的例子如下所示:<propertyname="username"<propertyname="password"<propertyname="dataSource"你可以使用不同的關(guān)系數(shù)據(jù)庫管理系統(tǒng),通過修改上面的的Spring配置。據(jù)庫結(jié)構(gòu)附錄)還有一種選擇是把權(quán)限分組,然后讓用戶加入這些用戶組。一些人更喜歡使用這種方法來管理用戶的權(quán)限。參考JdbcDaoImpl的Javadoc以獲得的信息,了ijeruhe啟用權(quán)限分組。用戶組使用的數(shù)據(jù)庫結(jié)構(gòu)也包含在附錄中。SpringSecurity的PasswordEncoder接口用來支持對通過一些方式進行加密,并保存到媒介中。這通常意味著被“散列加密”,使用一個加密算法,比如MD5或者SHA。加密不是SpringSecurity一個很容易搞混的來源。一個散列(或)算法是一個單向方法提供了一小段固定長度的輸出數(shù)據(jù)(散列)從一些輸入數(shù)據(jù)中,比如一個。作為一個例子,字符串“password”的MD5散列(16進制)是“單向的在這種情況下,很難(基本上不可能)根據(jù)給出的散列值獲得原始輸們可以保存在你的用戶數(shù)據(jù)庫中作為原始明文的替換,假設(shè)這些值被了也無使用加密的一個潛在的問題是,因為散列是單向的,如果輸入是一個常用的單詞的5f4dcc3b5aa765d61d8327deb882cf99通過。我們會很快找到原始詞是“password”。簡單的方法,一個者可以建立一個散列值的字典把標準單詞排列,使用它來查找原始。一個方法來幫助防止這種問題是使用高強度的策略來防止使用常用單詞。另一個是在計算散列時使用“鹽值”。這是一個對每個用戶都知道的附加字符串,它會結(jié)合到中,在計算散列之前。注意這個數(shù)值應(yīng)該是盡可能的隨SpringSecuritySaltSource接口,可以被驗證供應(yīng)器用來為特定的用戶生成一個鹽值。使用鹽值,意味著者必須創(chuàng)建單獨的散列字典,為不同的鹽值,這讓更難了(但不是不可能)。當(dāng)一個認證供應(yīng)器(比如SpringSecurityDaoAuthenticationProvider)需要檢驗,在提交認證請求中,與用戶知道的數(shù)據(jù)進行比較,保存的通過一些方式進行了加密,然后提交的數(shù)據(jù)必須也使用相同的算法進行加密。這要求你去檢查兼容性,因為SpringSecurity對持久化的沒有任何控制。如果你在SpringSecurity的認證配置中添加了散列功能,你的數(shù)據(jù)庫包含原始明文,那么認證就絕對不可能成功。如果你在數(shù)據(jù)庫中使用MD5對加密,比如,你的應(yīng)用配置為使用SpringSecurity的Md5PasswordEncoder,這也有其他可能的問題。數(shù)據(jù)庫可能用Base6416進制的字符串(默認)[5]你的數(shù)據(jù)庫可能使用了大寫,當(dāng)編輸出的是小寫。確定你編寫了一個測試來檢測從你的編的輸出,使用一個知道的和鹽值結(jié)合檢測它是否與數(shù)據(jù)庫值匹配,在更深入之前,嘗試通過你的系統(tǒng)認證。要想獲得信息,在默認的方法從結(jié)合鹽值和,查看BasePasswordEncoder的Javadoc。如果你希望直接通過java生成,為你的用戶數(shù)據(jù)庫保存,然后你可以使用PasswordEncoder的encodePassword方法。PartIIIweb大多數(shù)SpringSecurity的用戶使用框架是基于HTTP和ServletAPI的。在這一章和以后的章節(jié)中,我們會看一下如何使用SpringSecurity提供驗證和權(quán)限控制特性,用于應(yīng)用的web層。我們會介紹命名空間外觀的背后,看看哪些類和接口實際上用于提供webbean配置來提供對配置的完全和,所以我們也會看到如何直接配置這些類,不使用命名空間。SpringSecurity的web架構(gòu)是完全基于標準的servlet用servlet或任何其他基于servlet的框架(比如springmvc)特定的webHttpServletRequest和HttpServletResponse,不關(guān)心請求時來自瀏覽器,web服務(wù)客戶端,HttpInvoker還是一個AJAX應(yīng)用。SpringSecurity了一個過濾器鏈,每個過濾器擁有特定的功能,過濾器需要服務(wù)也會對應(yīng)添加和刪除。過濾器的次序是非常重要的,它們之間都有依賴關(guān)系。如果你SpringBean,但是有時候你需要完全控制Spring過濾器鏈,因為你使用了命名空間沒有提供的特當(dāng)使用servlet過濾器時你很需要在你的web.xml中它們,它們可能被servlet容器忽略。在SpringSecurityxml中的springbeanSpringspring的DelegatingFilter提供了在web.xml和applicationcontext之間的聯(lián)系。DelegatingFilter,你會看到像web.xml>>注意這個過濾器其實是一個DelegatingFilter,這個過濾器里沒有實現(xiàn)過濾器的任輯。DelegatingFilter做的事情是代理Filter的方法,從applicationcontext里獲得bean。這讓bean可以獲得springwebapplication的javadoc獲得信息?,F(xiàn)在應(yīng)該清楚了,你可以每個SpringSecurity過濾器bean,你在applicationcontext中需要的。把一個DelegatingFilter 添加到web.xml,確認它們的次序是正確的。這是一種繁瑣的方式,會讓web.xml顯得十分雜亂,如果我們配置了太多過濾器的話。我們最好添加一個單獨的,在web.xml中,然后在applicationcontext中處理實體,管理我們的web安全bean。這就是FilterChain所做的事情。它使用DelegatingFilter(就像上面例子中 org.springframework.security.web.FilterChain。 過濾器鏈是在applicationcontext中的。這里有一個例子:"<sec:filter-chain-mappath-<sec:filter-chainpattern="/webServices/**"filters="filterSecurityInterceptor"/><sec:filter-chainpattern="/**"filterSecurityInterceptor"/>你可能注意到FilterSecurityInterceptor的不同方式。命名空間元素filter-chain-mapURL模式,到過濾器鏈中,從beanfiltersant路徑,并且只使用第一個出現(xiàn)的匹配URI。在運行階段FilterChain會定位當(dāng)前web請求匹配的第一個URIfiltersbean列表將開始處理請你可能注意到了,我們在過濾器鏈里了兩個SecurityContextPersistenceFilter(ASC是allowSessionCreation的簡寫,是SecurityContextPersistenceFilter的一個屬性)。因為web服務(wù)從來不會在請jsessionid果你需要構(gòu)建一個高等級最高可擴展性的系統(tǒng),我們推薦你使用上面的配置方法。對于小一點兒的項目,使用一個HttpSessionContextIntegrationFilter(讓它的allowSessionCreationtrue)就足夠了。在有關(guān)周期的問題上,如果這些方法被FilterChain自己調(diào)用,F(xiàn)ilterChain會始終根據(jù)下一層的Filterinit(FilterConfig)和上調(diào)用一次,而不管它在過濾器鏈中被了多少次)。你控制著所有的抉擇,比如這些方法是否被調(diào)用或targetFilterLifecycle初始化參數(shù)DelegatingFilter。默認情況下,這個參數(shù)是false,servlet容器生命周期調(diào)用不會到Delegati

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論