对spring-vault使用多个ClientAuthentiation

时间:2017-06-21 16:18:49

标签: spring-boot configuration automatic-properties hashicorp-vault spring-vault

我们有一个使用spring-vault的应用程序。它使用AppRole对Vault进行身份验证。我们使用从该操作获得的令牌来读取和写入秘密。 VaultEndpointAppRoleAuthentication的配置是从属性文件中自动配置的。

代码如下所示:

@Autowired
private ApplicationContext context;

@Autowired
private VaultOperations vault;

private Logger logger = LoggerFactory.getLogger(VaultFacade.class);

public VaultFacadeImpl() {
    logger.debug("Creating VaultFacade with autowired context");
    context = new AnnotationConfigApplicationContext(VaultConfig.class);

    vault = context.getBean(VaultTemplate.class);
    //vault variable ready to use with vault.read or vault.write 
    //in our VaultFacadeImpl
}

我想保留autowire功能,但也支持其他两个ClientAuthentication实现:

  • 现有的TokenAuthentication
  • 自定义ClientAuthentication实施(LDAP身份验证后端)

最终结果将是同时提供两种身份验证机制。某些操作将使用应用程序的凭据(Vault中的AppRole)执行,其他操作使用用户的凭据(Vault中的LDAP)执行。

我想我可以创建多个AbstractVaultConfiguration类,每个类都返回一个不同的ClientAuthentication派生词。但是,如何为配置类创建VaultTemplate?

1 个答案:

答案 0 :(得分:2)

如果你想要一个额外的VaultTemplate bean,那么你需要自己配置和声明bean。您可以保留AbstractVaultConfiguration提供的基础。您的配置可能如下所示:

@Configuration
public class CustomConfiguration {

    @Bean
    public VaultTemplate ldapAuthVaultTemplate(ClientFactoryWrapper clientHttpRequestFactoryWrapper, 
                            ThreadPoolTaskScheduler threadPoolTaskScheduler) {
        return new VaultTemplate(…, 
                clientHttpRequestFactoryWrapper.getClientHttpRequestFactory(), 
                ldapSessionManager(threadPoolTaskScheduler));
    }

    @Bean
    public SessionManager ldapSessionManager(ThreadPoolTaskScheduler threadPoolTaskScheduler) {

        ClientAuthentication clientAuthentication = new MyLdapClientAuthentication(…);

        return new LifecycleAwareSessionManager(clientAuthentication,
                                                threadPoolTaskScheduler, 
                                                …);
    }
}

在客户端(使用第二个VaultTemplate),您需要确保查找适当的实例。 Spring不限制每种类型的bean,但允许注册多个相同类型的bean。