【问题标题】:Load IDPs from a database Spring SAML从数据库 Spring SAML 加载 IDP
【发布时间】:2016-08-24 13:38:26
【问题描述】:

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

【问题讨论】:

    标签: spring-saml


    【解决方案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();
        }
    }
    

    接下来您需要一个服务,该服务在启动时可以返回这些 MetadataProvider 的列表并将它们加载到您的 MetadataManager。

    【讨论】:

      猜你喜欢
      • 2016-01-26
      • 1970-01-01
      • 2014-09-23
      • 2014-12-25
      • 2015-03-27
      • 2014-12-11
      • 1970-01-01
      • 2021-10-16
      • 2017-04-13
      相关资源
      最近更新 更多