2016-08-24 64 views
0

我有一個使用java配置的Spring SAML項目,我使用FilesystemMetadataProvider從文件加載IDP元數據。我希望能夠在啓動時從數據庫加載IDP。如果我需要更改配置,我不想重新啓動應用程序以加載更改。有一個重新加載HTTPMetadataProvider,是否有一個數據庫?這可能嗎?從數據庫中加載IDP Spring SAML

回答

0

AbstractReloadingMetadataProvider沒有實現你本來想要的功能,但是,實現你自己的功能並不困難。

SSOProfile包含IDP的XML。 AbstractReloadingMetadataProvider將使用重寫的方法來定期訪問數據庫並重新加載對元數據的所有更改。

public class DatabaseMetadataProvider extends AbstractReloadingMetadataProvider { 

    private final Logger log = LoggerFactory.getLogger(DatabaseMetadataProvider.class); 

    private SSOProfileService samlService; 

    private String entityId; 

    public DatabaseMetadataProvider(Timer backgroundTaskTimer, String entityId, SSOProfileService samlService) throws MetadataProviderException { 
     super(backgroundTaskTimer); 
     if (entityId == null) { 
      throw new MetadataProviderException("EntityId may not be null"); 
     } 
     this.entityId = entityId; 
     if (samlService == null) { 
      throw new MetadataProviderException("Saml Service must not be null"); 
     } 
     this.samlService = samlService; 

    } 

    @Override 
    protected String getMetadataIdentifier() { 
     return entityId; 
    } 

    @Override 
    protected byte[] fetchMetadata() throws MetadataProviderException { 
     SSOProfile ssoSaml = samlService.getSSOSamlProfileByEntityID(entityId); 
     if (ssoSaml == null) { 
      log.error("Could not find a valid entity in the DB for " + entityId + " to refresh from. "); 
      return null; 
     } else { 
      log.trace("Found idp metadata for " + ssoSaml.getEntityID() + ": " + ssoSaml.getIdpMetaData()); 
      return ssoSaml.getIdpMetaData().getBytes(StandardCharsets.UTF_8); 
     } 
    } 

    /** {@inheritDoc} */ 
    @Override 
    public synchronized void destroy() { 
     samlService = null; 
     entityId = null; 
     super.destroy(); 
    } 
} 

你需要接下來的事情是,在啓動時可以恢復這些MetadataProviders的列表,並在您MetadataManager加載它們的服務。