从数据库Spring SAML加载IDP

时间:2016-08-24 13:38:26

标签: spring-saml

我有一个使用java配置的Spring SAML项目,我使用FilesystemMetadataProvider从文件中加载IDP元数据。我希望能够在启动时从数据库加载IDP。如果我需要更改配置,我不想重新启动应用程序以加载更改。有一个重新加载HTTPMetadataProvider,有一个数据库吗?这可能吗?

1 个答案:

答案 0 :(得分:1)

没有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中。