从数据库 Spring SAML 加载 IDP
Load IDPs from a database Spring SAML
我有一个使用 java 配置的 Spring SAML 项目,我使用 FilesystemMetadataProvider
从文件加载 IDP 元数据。我希望能够在启动时从数据库加载 IDP。如果我需要更改配置,我不想重新启动应用程序来加载更改。有重载HTTPMetadataProvider
,有数据库的吗?这可能吗?
没有 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();
}
}
接下来您需要的是一个服务,该服务在启动时可以 return 这些 MetadataProvider 的列表并将它们加载到您的 MetadataManager 中。
我有一个使用 java 配置的 Spring SAML 项目,我使用 FilesystemMetadataProvider
从文件加载 IDP 元数据。我希望能够在启动时从数据库加载 IDP。如果我需要更改配置,我不想重新启动应用程序来加载更改。有重载HTTPMetadataProvider
,有数据库的吗?这可能吗?
没有 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();
}
}
接下来您需要的是一个服务,该服务在启动时可以 return 这些 MetadataProvider 的列表并将它们加载到您的 MetadataManager 中。