欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

《Spring Security3》附录翻译(参考资料)

程序员文章站 2022-03-02 16:03:31
...

 

附录:参考材料

         在本附录中,将会涉及到一些我们感觉有用的参考材料(并相当缺乏文档),而将其插入到章节的内容中又会觉得过于综合。

JBCP Pets示例代码起步

         就像我们在第一章:一个不安全应用的剖析中所描述的那样,我们假设你已有了Eclipse 3.4(或3.5IDE,并包含Web Tools PackageWTP)。示例代码按每章被组织成了不同的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

         以下的URLSpring 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)。记住,SecurityMetadataSourceAccessDecisionVoter都要移除。

逻辑过滤器名字迁移参考

         正如在第十三章:迁移到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