将多个 ClientAuthentiation 与 spring-vault 一起使用

Posted

技术标签:

【中文标题】将多个 ClientAuthentiation 与 spring-vault 一起使用【英文标题】:Use multiple ClientAuthentiation with spring-vault 【发布时间】:2017-11-24 16:06:03 【问题描述】:

我们有一个使用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】:

如果你想有一个额外的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。

【讨论】:

能否请您提供 LDAP 身份验证方法的完整工作代码。

以上是关于将多个 ClientAuthentiation 与 spring-vault 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

如何将多个 nib 文件与多个数组一起使用?

将多个字段与条件组合

将 INDEX/MATCH 与多个条件和多个匹配项连接起来

如何将单个小部件与多个提供程序一起使用?

将 localtunnel\ngrok 与多个本地站点一起使用

如何将 QVector 与多个对象一起使用