(翻译)Spring Security-2.0.x参考文档“替换验证身份”

替换验证身份
20.1. 概述

AbstractSecurityInterceptor可以在安全对象回调期间,暂时替换SecurityContext和SecurityContextHolder里的Authentication对象。 只有在原始Authentication对象被AuthenticationManager和AccessDecisionManager成功处理之后,才有可能发生这种情况。 如果有需要,RunAsManager会显示替换的Authentication对象,这应该通过SecurityInterceptorCallback调用。

通过在安全对象回调过程中临时替换 Authentication 对象,安全调用可以调用其他需要不同认证授权证书的对象。 这也可以为特定的GrantedAuthority对象执行内部安全检验。 因为Spring Security提供不少帮助类,能够基于SecurityContextHolder的内容自动配置远程协议,这些运行身份替换在远程web服务调用的时候特别有用。
20.2. 配置

一个Spring Security提供的 RunAsManager 接口::

  Authentication buildRunAs(Authentication authentication, Object object, ConfigAttributeDefinition config);
  boolean supports(ConfigAttribute attribute);
  boolean supports(Class clazz);
           

第一个方法返回 Authentication对象,在方法的调用期间替换以前的 Authentication 对象。 如果方法返回null,意味着不需要进行替换。 第二个方法用在AbstractSecurityInterceptor中,作为它启动时校验配置属性的一部分。 supports(Class)方法会被安全拦截器的实现调用,确保配置的RunAsManager支持安全拦截器即将执行的安全对象类型。

Spring Security提供了一个 RunAsManager的具体实现。 如果任何一个ConfigAttribute是以RUN_AS_开头的,RunAsManagerImpl类返回一个替换的RunAsUserToken。 如果找到了任何这样的ConfigAttribute,替换的 RunAsUserToken会通过一个新的GrantedAuthorityImpl,为每一个RUN_AS_ ConfigAttribute包含同样的主体,证书,赋予的权限,就像原来的Authentication对象一样。 每个新 GrantedAuthorityImpl 会以ROLE_开头,对应RUN_AS ConfigAttribute。 比如,一个替代RunAsUserToken,对于RUN_AS_SERVER的结果是包含一个ROLE_RUN_AS_SERVER赋予的权限。

替代的 RunAsUserToken 就像其他 Authentication 对象一样。 它可能需要通过代理合适的AuthenticationProvider被AuthenticationManager验证。 这个RunAsImplAuthenticationProvider执行这样的认证,它直接获得任何一个有效的RunAsUserToken。

为了保证恶意代码不会创建一个RunAsUserToken,由RunAsImplAuthenticationProvider保障获得一个key的散列值被保存在所有生成的标记里。 RunAsManagerImpl和RunAsImplAuthenticationProvider在bean上下文里,创建使用同样的key:

<bean id="runAsManager" class="org.springframework.security.runas.RunAsManagerImpl">
  <property name="key" value="my_run_as_password"/>
</bean>

<bean id="runAsAuthenticationProvider"
    class="org.springframework.security.runas.RunAsImplAuthenticationProvider">
  <property name="key" value="my_run_as_password"/>
</bean>

通过使用相同的key,每个RunAsUserToken可以被它验证,并使用对应的RunAsManagerImpl创建。 出于安全原因,这个RunAsUserToken创建后就不能改变。

你可能感兴趣的:(spring,Web,bean,Security)