0

我們有一個應用程序使用spring-vault。它使用AppRole向Vault進行身份驗證。我們使用從該操作獲得的令牌讀取和寫入機密。 VaultEndpointAppRoleAuthentication的配置是從屬性文件自動配置的。使用多個ClientAuthentiation與彈簧庫

代碼如下所示:

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

我想保持自動裝配功能,而且還支持另外兩種ClientAuthentication實現:

  • 現有TokenAuthentication
  • 自定義ClientAuthentication實現(LDAP auth後端)

最終的結果是可以同時使用兩種認證機制。一些操作將使用應用程序的憑證(Vault中的AppRole)執行,其他操作則使用用戶憑證(Vault中的LDAP)執行。

我想我可以創建多個AbstractVaultConfiguration類,每個類都返回一個不同的ClientAuthentication衍生物。但是,我怎樣才能爲配置類創建一個VaultTemplate?

+0

是否要添加有關使用單個身份驗證的客戶端身份驗證的選項,或者您希望支持同時處於活動狀態的多個身份驗證機制(在相同的應用程序實例中)? – mp911de

+0

兩者在同一應用程序實例中同時處於活動狀態。澄清我的問題,謝謝! – ixe013

回答

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。