《Spring Security3》附录翻译(参考资料)
附录:参考材料
在本附录中,将会涉及到一些我们感觉有用的参考材料(并相当缺乏文档),而将其插入到章节的内容中又会觉得过于综合。
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 Security3》第六章第二部分翻译(自定义AuthenticationProvider)
-
《Spring Security3》第六章第四部分翻译(异常处理)
-
《Spring Security3》第四章第三部分翻译上(配置安全的密码)
-
《Spring Security3》第一章第一部分翻译
-
《Spring Security3》第六章第二部分翻译(自定义AuthenticationProvider)
-
《Spring Security3》第四章第三部分翻译下(密码加salt)
-
《Spring Security3》第二章第一部分翻译
-
《Spring Security3》第四章第四部分翻译(Remember me后台存储和SSL)附前四章doc文件
-
《Spring Security3》第三章第四部分翻译(修改密码)
-
《Spring Security3》第四章第一部分翻译上(数据库管理信息)