2016-08-24 4 views
0

У меня есть проект Spring SAML с использованием java-конфигураций, где я загружаю метаданные IDP из файла с помощью FilesystemMetadataProvider. Я хотел бы иметь возможность загружать IDP из базы данных при запуске. Если мне нужно изменить конфигурацию, я не хочу перезагружать приложение для загрузки изменений. Есть перезагрузка HTTPMetadataProvider, есть ли один для баз данных? Это возможно?Загрузка IDP из базы данных Spring SAML

ответ

0

Существует не реализация AbstractReloadingMetadataProvider, которая делает то, что вы ищете изначально, однако ее нетрудно реализовать самостоятельно.

SSOProfile содержит XML IDP. 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.