附录:参考材料
在本附录中,将会涉及到一些我们感觉有用的参考材料(并相当缺乏文档),而将其插入到章节的内容中又会觉得过于综合。
JBCP Pets示例代码起步
就像我们在第一章:一个不安全应用的剖析中所描述的那样,我们假设你已有了Eclipse 3.4(或3.5)IDE,并包含Web Tools Package(WTP)。示例代码按每章被组织成了不同的ZIP文件,并有一个较大的ZIP文件其中包含了编译和运行示例应用所需要的所有依赖(注意的是,当你阅读本书的时候对应于最新版本的Spring Security它们可能已经较旧了,但是鉴于示例代码和依赖是一个静态的快照,它们能够永远运行)。
我们建议你对每一章建立新的Eclipse工作空间,这样你能够切换工作空间而不用打开或关闭项目。
以下的步骤帮助你建立新的工作空间。首先,我们要导入Dependencies项目到工作空间中:
l 选择“File”按钮,接下来是“Import…”选项。选择“General”文件夹以及“Existing Projects into Workspace”并点击“Next”;
l 确保“Select root directory”选项被选中,点击“Browse...”按钮到文本框。定位到你解压Dependencies.zip的目录并点击“OK”;
l 你应该可以看到Dependencies项目被列了出来。点击“Finish”。
接下来,我们需要导入每章的源码ZIP文件。假设你已经解压了第二章:Spring Security起步的源码到目录中。
l 选择“File”菜单以及“Import…”选项。选择“General”文件夹以及“Existing Projects into Workspace”。点击“Next”;
l 确保“Select root directory”选项被选中并点击“Browse…”按钮到文本框。定位到你解压第二章源码ZIP文件的目录并点击“OK”;
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销毁时。 |
|
Spring Security的虚拟URL
以下的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——用来退出切换用户功能。
注意的是,有一些功能在本书中没有涵盖,但是在这里我们为了完整性全部包括了。
方法安全的明确bean配置
第六章源码的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 |

本文提供了一套完整的 Spring Security 示例代码,包括如何导入依赖、建立工作空间、部署应用以及理解关键事件。同时介绍了如何通过 Spring bean 配置启用方法安全,并详细解释了逻辑过滤器名称迁移,帮助开发者从 Spring Security 2 迁移到 Spring Security 3。此外,文章还包含了示例代码中涉及的各种事件和 URL 列表,为开发者提供了一个全面的实践参考。
364

被折叠的 条评论
为什么被折叠?



