2016-08-24 2 views
0

Ich habe ein Spring SAML-Projekt mit Java-Konfigurationen, wo ich IDP-Metadaten aus einer Datei mit einem FilesystemMetadataProvider laden. Ich möchte in der Lage sein, IDPs von einer Datenbank beim Start zu laden. Wenn ich die Konfiguration ändern muss, möchte ich die App nicht neu starten müssen, um die Änderungen zu laden. Es gibt eine Nachladung HTTPMetadataProvider, gibt es eine für Datenbanken? Ist das möglich?Load IDPs aus einer Datenbank Spring SAML

Antwort

0

Es gibt keine Implementierung der AbstractReloadingMetadataProvider, die tut, was Sie nativ suchen, aber es ist nicht schwierig, Ihre eigenen zu implementieren.

Das SSOProfile enthält das XML des IDP. Die AbstractReloadingMetadataProvider verwendet die überschriebenen Methoden, um regelmäßig zur Datenbank zu gehen und alle Änderungen an den Metadaten neu zu laden.

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(); 
    } 
} 

Das nächste, was Sie brauchen, ist ein Dienst, der beim Start eine Liste dieser MetadataProviders zurückkehren und sie in Ihrem MetadataManager zu laden.

Verwandte Themen