对于最新的稳定版本,请使用 Spring Security 6.4.1spring-doc.cn

运行方式身份验证替换

概述

能够在安全对象回调阶段和期间临时替换对象。 仅当原始对象由 和 成功处理时,才会发生这种情况。 将指示应在 .AbstractSecurityInterceptorAuthenticationSecurityContextSecurityContextHolderAuthenticationAuthenticationManagerAccessDecisionManagerRunAsManagerAuthenticationSecurityInterceptorCallbackspring-doc.cn

通过在安全对象回调阶段临时替换对象,安全调用将能够调用需要不同身份验证和授权凭证的其他对象。 它还将能够对特定对象执行任何内部安全检查。 因为Spring Security提供了许多帮助程序类,这些帮助程序类根据内容自动配置远程协议,所以这些运行方式替换在调用远程 Web 服务时特别有用。AuthenticationGrantedAuthoritySecurityContextHolderspring-doc.cn

配置

Spring Security 提供了一个接口:RunAsManagerspring-doc.cn

Authentication buildRunAs(Authentication authentication, Object object,
	List<ConfigAttribute> config);

boolean supports(ConfigAttribute attribute);

boolean supports(Class clazz);

第一个方法返回应在方法调用期间替换现有对象的对象。 如果该方法返回 ,则表示不应进行替换。 第二种方法被 用作其 configuration attributes 的启动验证的一部分。 该方法由安全侦听器实现调用,以确保配置的支持安全侦听器将呈现的安全对象的类型。AuthenticationAuthenticationnullAbstractSecurityInterceptorsupports(Class)RunAsManagerspring-doc.cn

Spring Security 提供了 a 的一个具体实现。 如果 any 以 . 如果找到任何此类对象,则替换将包含与原始对象相同的主体、凭据和授予的权限,以及每个对象的 new 。 每个 new 都将以 为前缀,后跟 . 例如,a 将导致包含授予权限的替换。RunAsManagerRunAsManagerImplRunAsUserTokenConfigAttributeRUN_AS_ConfigAttributeRunAsUserTokenAuthenticationSimpleGrantedAuthorityRUN_AS_ConfigAttributeSimpleGrantedAuthorityROLE_RUN_ASConfigAttributeRUN_AS_SERVERRunAsUserTokenROLE_RUN_AS_SERVERspring-doc.cn

替换就像任何其他对象一样。 它需要由 进行身份验证,可能是通过委派给合适的 . 执行此类身份验证。 它只是接受 any presented。RunAsUserTokenAuthenticationAuthenticationManagerAuthenticationProviderRunAsImplAuthenticationProviderRunAsUserTokenspring-doc.cn

为了确保恶意代码不会创建并呈现它以保证被 接受,密钥的哈希值将存储在所有生成的令牌中。 和 是在 bean 上下文中使用相同的键创建的:RunAsUserTokenRunAsImplAuthenticationProviderRunAsManagerImplRunAsImplAuthenticationProviderspring-doc.cn

<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>

通过使用相同的密钥,可以验证每个密钥都是由已批准的 . 出于安全原因,创建后是不可变的RunAsUserTokenRunAsManagerImplRunAsUserTokenspring-doc.cn