在本附錄中,將會涉及到一些咱們感受有用的參考材料(並至關缺少文檔),而將其插入到章節的內容中又會以爲過於綜合。web
就像咱們在第一章:一個不安全應用的剖析中所描述的那樣,咱們假設你已有了Eclipse 3.4(或3.5)IDE,幷包含Web Tools Package(WTP)。示例代碼按每章被組織成了不一樣的ZIP文件,並有一個較大的ZIP文件其中包含了編譯和運行示例應用所須要的全部依賴(注意的是,當你閱讀本書的時候對應於最新版本的Spring Security它們可能已經較舊了,可是鑑於示例代碼和依賴是一個靜態的快照,它們可以永遠運行)。spring
咱們建議你對每一章創建新的Eclipse工做空間,這樣你可以切換工做空間而不用打開或關閉項目。express
如下的步驟幫助你創建新的工做空間。首先,咱們要導入Dependencies項目到工做空間中:安全
l 選擇「File」按鈕,接下來是「Import…」選項。選擇「General」文件夾以及「Existing Projects into Workspace」並點擊「Next」;服務器
l 確保「Select root directory」選項被選中,點擊「Browse...」按鈕到文本框。定位到你解壓Dependencies.zip的目錄並點擊「OK」;session
l 你應該能夠看到Dependencies項目被列了出來。點擊「Finish」。併發
接下來,咱們須要導入每章的源碼ZIP文件。假設你已經解壓了第二章:Spring Security起步的源碼到目錄中。ide
l 選擇「File」菜單以及「Import…」選項。選擇「General」文件夾以及「Existing Projects into Workspace」。點擊「Next」;post
l 確保「Select root directory」選項被選中並點擊「Browse…」按鈕到文本框。定位到你解壓第二章源碼ZIP文件的目錄並點擊「OK」;spa
l 你能夠看到「JBCPPets」項目和「Servers」項目被裂了出來。將它們都選中而後點擊「Finish」。
最後,咱們須要將JBCP Pets web應用部署到一個Tomcat實例上(或者你喜歡的應用服務器)。
l 右鍵點擊「JBCPPets」項目並選擇「Run As」菜單。在子菜單中選擇「Run on Server」菜單項;
l 這時候你可能須要建立一個新的應用服務器實例。只須要按照你應用服務器的提示直到web應用部署完成。
此時,你應該能夠運行JBCP Pets應用了。若是你遇到問題,可查看以下的列表:
l Eclipse是否列出了構建錯誤?若是有任何的Java錯誤或classpath錯誤,它們是應該被解決的真正錯誤。有時候,Spring IDE插件會報出假的錯誤或警告;
l 查看Eclipse的應用服務器啓動控制檯,這裏包含不成功部署的web應用的錯誤。最多見的問題是缺失classpath條目,或者忘記將全部的classpath條目添加到JBCPPets 項目的「Java EE Module Dependencies」。儘管這些應該已經爲你作好,可是咱們不能保證在任何版本的Eclipse下均好用。
對於示例代碼有任何問題請聯繫咱們——理解代碼和它的概念對你來講很重要!
下面的表格,在第六章:高級配置和擴展曾經提到,列出了各類Spring Security元素所發佈的所有事件並提供了第二章中引用到的認證異常。爲了簡便,咱們移除了包名,由於全部的時間都在o.s.s.authentication.event(認證相關的事件)和o.s.s.access.event(受權相關的事件)中。
類名 |
什麼時候觸發 |
匹配的異常 |
AbstractAuthenticationEvent |
全部認證時間的通用父類。注意這是一個歷來不會被拋出的抽象異常(儘管其能夠被捕獲) |
|
AbstractAuthenticationFailureEvent |
全部認證失敗事件的通用父類。注意這是一個歷來不會被拋出的抽象異常(儘管其能夠被捕獲) |
|
AuthenticationFailureBadCredentialsEvent |
當提供的憑證(如用戶名和密碼)不合法時。它可以用來(有意的)掩蓋UsernameNotFoundException。 |
BadCredentialsException UsernameNotFoundException |
AuthenticationFailureConcurrentLoginEvent |
當併發session最大值超出時。 |
ConcurrentLoginException |
AuthenticationFailureCredentialsExpiredEvent |
當UserDetails標識用戶憑證過時時。 |
CredentialsExpiredException |
AuthenticationFailureDisabledEvent |
當UserDetails標識用戶憑證不可用時。 |
DisabledException |
AuthenticationFailureExpiredEvent |
當UserDetails標識用戶帳號過時時。 |
AccountExpiredException |
AuthenticationFailureLockedEvent |
當UserDetails標識用戶帳號被鎖定時。 |
LockedException |
AuthenticationFailureProviderNotFoundEvent |
配置錯誤,當不能找到Authentication Provider認證用戶請求時。 |
ProviderNotFoundException |
AuthenticationFailureProxyUntrustedEvent |
當CAS代理ticket不可信時。 |
|
AuthenticationFailureServiceExceptionEvent |
當底層服務(如DAO Provider)失敗時,拋出的通常異常。 |
AuthenticationServiceException |
AuthenticationSuccessEvent |
當用戶成功認證時。 |
|
AuthenticationSwitchUserEvent |
當成功完成用戶切換行爲時。 |
|
InteractiveAuthenticationSuccess Event |
當用戶經過提供完整憑證認證成功時(相似於IS_FULLY_AUTHENTICATED GrantedAuthority語法) |
|
AbstractAuthorizationEvent |
全部認證事件的通用父類。 |
|
AuthenticationCredentialsNot FoundEvent |
當用戶沒有認證而試圖觸發須要訪問檢查的方法時。 |
|
AuthorizationFailureEvent |
當方法前或後的訪問檢查失敗時。 |
|
AuthorizedEvent |
當方法前或後的訪問檢查成功時。 |
|
PublicInvocationEvent |
當未認證的安全對象請求成功時。 |
|
SessionCreationEvent |
HttpSession建立時。 |
|
SessionDestroyedEvent |
HttpSession銷燬時。 |
|
如下的URL被Spring Security視爲虛擬URL,並獨立於你的代碼做爲servelt過濾器流程的一部分進行監視(並處理)。記住的是這些URL是相對於你的web應用上下文根的。
l /j_spring_security_check——被UsernamePasswordAuthenticationFilter檢查進行用戶名/密碼form認證;
l /j_spring_openid_security_check——被OpenIDAuthenticationFilter檢查OpenID返回認證信息(從OpenID provider處);
l /j_spring_cas_security_check——基於CAS SSO登陸的返回,進行CAS認證
l /spring_security_login——當配置自動生成登陸頁面時,DefaultLoginPageGeneratingFilter使用的URL;
l /j_spring_security_logout——LogoutFilter使用來檢測退出行爲;
l /saml/SSO——Spring Security SAML SSO extension SAMLProcessingFilter使用來進行SAML SSO登陸請求;
l /saml/logout——Spring Security SAML SSO extension SAMLLogoutFilter使用來進行SAML SSO退出請求;
l /j_spring_security_switch_user——SwitchUserFilter使用來將用戶切換至另外一用戶;
l /j_spring_security_exit_user——用來退出切換用戶功能。
注意的是,有一些功能在本書中沒有涵蓋,可是在這裏咱們爲了完整性所有包括了。
第六章源碼的dogstore-explicit-base.xml文件中包含了這裏bean聲明的全集。咱們之因此在第六章自己中沒有包含它,是由於它與要表述的沒有太大關係(參考第五章:精確的訪問控制來了解相關bean的功能)。
如下是經過Spring bean聲明啓用方法安全的完整配置:
<!-- ************************************************** --> <!-- Method Authorization --> <!-- ************************************************** --> <bean class="org.springframework.security.access.intercept. aopalliance.MethodSecurityInterceptor" id="methodSecurityInterceptor"> <property name="accessDecisionManager" ref="methodAccessDecisionMan ager"/> <property name="authenticationManager" ref="customAuthenticationMan ager"/> <property name="securityMetadataSource" ref="delegatingMetadataSour ce"/> <property name="afterInvocationManager" ref="afterInvocationManager "/> </bean> <bean class="org.springframework.security.access.intercept. aopalliance.MethodSecurityMetadataSourceAdvisor" id="methodSecurityMet adataSourceAdvisor"> <constructor-arg value="methodSecurityInterceptor"/> <constructor-arg ref="delegatingMetadataSource"/> </bean> <bean class="org.springframework.aop.framework.autoproxy. DefaultAdvisorAutoProxyCreator" id="defaultAdvisorAutoProxyCreator"> <property name="beanName" value="methodSecurityMetadataSourceAdviso r"/> </bean> <bean class="org.springframework.security.access.intercept. AfterInvocationProviderManager" id="afterInvocationManager"> <property name="providers"> <list> <ref local="postAdviceProvider"/> </list> </property> </bean> <bean class="org.springframework.security.access.vote. AffirmativeBased" id="methodAccessDecisionManager"> <property name="decisionVoters"> <list> <ref bean="preAdviceVoter"/> <ref bean="roleVoter"/> <ref bean="authenticatedVoter"/> <ref bean="jsr250Voter"/> <!-- For JSR 250 Method Annotations --> </list> </property> </bean> <!-- Overall Delegating Metadata Source --> <bean class="org.springframework.security.access.method. DelegatingMethodSecurityMetadataSource" id="delegatingMetadataSource"> <property name="methodSecurityMetadataSources"> <list> <ref local="prePostMetadataSource"/> <ref local="securedMetadataSource"/> <ref local="jsr250MetadataSource"/> </list> </property> </bean> <!-- JSR 250 Method Voters --> <bean class="org.springframework.security.access.annotation. Jsr250MethodSecurityMetadataSource" id="jsr250MetadataSource"/> <bean class="org.springframework.security.access.annotation. Jsr250Voter" id="jsr250Voter"/> <!-- Spring @Secured Beans --> <bean class="org.springframework.security.access.annotation. SecuredAnnotationSecurityMetadataSource" id="securedMetadataSource"/> <!-- @Pre/@Post Method Advice Voters --> <bean class="org.springframework.security.access.prepost. PreInvocationAuthorizationAdviceVoter" id="preAdviceVoter"> <constructor-arg ref="exprPreInvocationAdvice"/> </bean> <bean class="org.springframework.security.access.prepost. PostInvocationAdviceProvider" id="postAdviceProvider"> <constructor-arg ref="exprPostInvocationAdvice"/> </bean> <bean class="org.springframework.security.access.prepost. PrePostAnnotationSecurityMetadataSource" id="prePostMetadataSource"> <constructor-arg ref="exprAnnotationAttrFactory"/> </bean> <!-- @Pre/@Post Method Expression Handler --> <bean class="org.springframework.security.access.expression.method. DefaultMethodSecurityExpressionHandler" id="methodExprHandler"/> <bean class="org.springframework.security.access.expression.method. ExpressionBasedPreInvocationAdvice" id="exprPreInvocationAdvice"> <property name="expressionHandler" ref="methodExprHandler"/> </bean> <bean class="org.springframework.security.access.expression.method. ExpressionBasedPostInvocationAdvice" id="exprPostInvocationAdvice"> <constructor-arg ref="methodExprHandler"/> </bean> <bean class="org.springframework.security.access.expression.method. ExpressionBasedAnnotationAttributeFactory" id="exprAnnotationAttrFact ory"> <constructor-arg ref="methodExprHandler"/> </bean>
請注意,明確的bean配置與你使用的Spring Security版本密切相關(就像咱們在第六章提到的)。若是在你版本的Spring Security中使用列出的bean遇到問題,請參考o.s.s.config.method.GlobalMethodSecurityBeanDefinitionParser。
這個配置啓用了JSR-250的@Secured和@Pre/@Post註解。若是你不使用它們要註釋掉或移除相關的支持bean(如@Secured)。記住,SecurityMetadataSource和AccessDecisionVoter都要移除。
正如在第十三章:遷移到Spring Security 3所討論的,不少邏輯過濾器名(在<custom-filter>用到)在從Spring Security 2升級到Spring Security 3時發生了變化。這裏咱們提供了全部的變化,來方便你從Spring Security 2 到3對自定義過濾器的配置:
Spring Security 2 |
Spring Security 3 |
CHANNEL_FILTER |
CHANNEL_FILTER |
CONCURRENT_SESSION_FILTER |
CONCURRENT_SESSION_FILTER |
SESSION_CONTEXT_INTEGRATION_ FILTER |
SECURITY_CONTEXT_FILTER |
LOGOUT_FILTER |
LOGOUT_FILTER |
PRE_AUTH_FILTER |
PRE_AUTH_FILTER |
CAS_PROCESSING_FILTER |
CAS_FILTER |
AUTHENTICATION_PROCESSING_FILTER |
FORM_LOGIN_FILTER |
OPENID_PROCESSING_FILTER |
OPENID_FILTER |
Spring Security 2沒有提供LOGIN_PAGE_FILTER |
LOGIN_PAGE_FILTER |
Spring Security 2沒有提供DIGEST_AUTH_FILTER |
DIGEST_AUTH_FILTER |
BASIC_PROCESSING_FILTER |
BASIC_AUTH_FILTER |
Spring Security 2沒有提供REQUEST_CACHE_FILTER |
REQUEST_CACHE_FILTER |
SERVLET_API_SUPPORT_FILTER |
SERVLET_API_SUPPORT_FILTER |
REMEMBER_ME_FILTER |
REMEMBER_ME_FILTER |
ANONYMOUS_FILTER |
ANONYMOUS_FILTER |
Spring Security 2沒有提供SESSION_MANAGEMENT_FILTER |
SESSION_MANAGEMENT_FILTER
|
EXCEPTION_TRANSLATION_FILTER |
EXCEPTION_TRANSLATION_FILTER |
NTLM_FILTER |
Spring Security 3中移除了NTLM_FILTER |
FILTER_SECURITY_INTERCEPTOR |
FILTER_SECURITY_INTERCEPTOR |
SWITCH_USER_FILTER |
SWITCH_USER_FILTER |