|
对于最新的稳定版本,请使用 Spring Security 6.5.3! |
运行身份身份验证替换
概述
这AbstractSecurityInterceptor能够临时替换Authentication对象SecurityContext和SecurityContextHolder在安全对象回调阶段。
仅当原始Authentication对象已成功处理AuthenticationManager和AccessDecisionManager.
这RunAsManager将指示更换Authentication对象(如果有),则应在SecurityInterceptorCallback.
通过临时将Authentication对象,则安全调用将能够调用需要不同身份验证和授权凭据的其他对象。
它还能够对特定GrantedAuthority对象。
因为 Spring Security 提供了许多帮助程序类,这些类可以根据SecurityContextHolder,这些运行方式替换在调用远程 Web 服务时特别有用。
配置
一个RunAsManager接口由 Spring Security 提供:
Authentication buildRunAs(Authentication authentication, Object object,
List<ConfigAttribute> config);
boolean supports(ConfigAttribute attribute);
boolean supports(Class clazz);
第一个方法返回Authentication对象,该对象应替换现有的Authentication对象。
如果该方法返回null,则表示不应进行更换。
第二种方法由AbstractSecurityInterceptor作为其配置属性启动验证的一部分。
这supports(Class)方法被安全拦截器实现调用,以确保配置的RunAsManager支持安全拦截器将呈现的安全对象类型。
一个具体的实现RunAsManager随 Spring Security 一起提供。
这RunAsManagerImpl类返回替换RunAsUserToken如果有ConfigAttribute开头为RUN_AS_.
如果有此类ConfigAttribute找到,替换RunAsUserToken将包含与原始相同的主体、凭据和授予的权限Authentication对象,以及新的SimpleGrantedAuthority对于每个RUN_AS_ ConfigAttribute.
每个新的SimpleGrantedAuthority前缀为ROLE_,后跟RUN_AS ConfigAttribute.
例如,一个RUN_AS_SERVER将导致替换RunAsUserToken包含一个ROLE_RUN_AS_SERVER授予权力。
替换RunAsUserToken就像其他的一样Authentication对象。
它需要通过AuthenticationManager,可能通过委托给合适的AuthenticationProvider.
这RunAsImplAuthenticationProvider执行此类身份验证。
它只是接受任何有效的RunAsUserToken提出。
确保恶意代码不会创建RunAsUserToken并出示它以保证被RunAsImplAuthenticationProvider,密钥的哈希值存储在所有生成的Tokens中。
这RunAsManagerImpl和RunAsImplAuthenticationProvider在 bean 上下文中使用相同的键创建:
<bean id="runAsManager"
class="org.springframework.security.access.intercept.RunAsManagerImpl">
<property name="key" value="my_run_as_password"/>
</bean>
<bean id="runAsAuthenticationProvider"
class="org.springframework.security.access.intercept.RunAsImplAuthenticationProvider">
<property name="key" value="my_run_as_password"/>
</bean>
通过使用相同的密钥,每个RunAsUserToken可以验证它是由已批准的RunAsManagerImpl.
这RunAsUserToken出于安全原因,创建后不可变