【发布时间】:2017-08-11 22:20:31
【问题描述】:
我正在使用带有 Spring-SAML 扩展的 WSO2 和 SSOCircle。我们此时正在测试配置,并在我们的 applicationContext 中定义了 2 个 IdP 和 2 个 SP。因此,目前,我们的 spring xml 配置中有 2 个静态定义的 IdP,这是有效的。出于测试目的,我们使用 CachingMetadataManager 和 ResourceBackedMetadataProvider 的组合,因此 IdP 元数据构建在我们的 WAR 存档中。示例:
<bean id="metadata" class="org.springframework.security.saml.metadata.CachingMetadataManager">
<constructor-arg>
<list>
<bean class="org.springframework.security.saml.metadata.ExtendedMetadataDelegate">
<constructor-arg>
<bean class="org.opensaml.saml2.metadata.provider.ResourceBackedMetadataProvider">
<constructor-arg>
<bean class="java.util.Timer"/>
</constructor-arg>
<constructor-arg>
<bean class="org.opensaml.util.resource.ClasspathResource">
<constructor-arg value="/metadata/wso2idp_metadata.xml"/>
</bean>
</constructor-arg>
<property name="parserPool" ref="parserPool"/>
</bean>
</constructor-arg>
<constructor-arg>
<bean class="org.springframework.security.saml.metadata.ExtendedMetadata">
</bean>
</constructor-arg>
</bean>
<bean class="org.springframework.security.saml.metadata.ExtendedMetadataDelegate">
<constructor-arg>
<bean class="org.opensaml.saml2.metadata.provider.ResourceBackedMetadataProvider">
<constructor-arg>
<bean class="java.util.Timer"/>
</constructor-arg>
<constructor-arg>
<bean class="org.opensaml.util.resource.ClasspathResource">
<constructor-arg value="/metadata/ssocircleidp_metadata.xml"/>
</bean>
</constructor-arg>
<property name="parserPool" ref="parserPool"/>
</bean>
</constructor-arg>
<constructor-arg>
<bean class="org.springframework.security.saml.metadata.ExtendedMetadata">
</bean>
</constructor-arg>
</bean>
</list>
</constructor-arg>
对于生产,我们希望能够将 IdP 元数据存储在数据库中(位于中心位置)。我希望能够在不重新部署 WAR 或重新启动服务器的情况下添加、删除和修改元数据。最初,我认为我可以覆盖 CachingMetadataManager 并定义一个 noarg 构造函数,该构造函数可以动态加载所有元数据提供程序,但这是不可能的,因为 CachingMetadataManager 只定义了一个必须接受 MetadataProvider 列表的构造函数。我最终做了以下事情:
<bean id="metadataList" class="org.arbfile.util.security.saml.DBMetadataProviderList">
<constructor-arg ref="parserPool" />
<constructor-arg>
<bean class="java.util.Timer"/>
</constructor-arg>
</bean>
<bean id="metadata" class="org.springframework.security.saml.metadata.CachingMetadataManager">
<constructor-arg ref="metadataList" />
</bean>
Bean metadataList 可以简单定义为:
public final class DBMetadataProviderList extends ArrayList<MetadataProvider>
{
private final static Logger log = LoggerFactory.getLogger(DBMetadataProviderList.class);
private ParserPool parser;
public DBMetadataProviderList(ParserPool _parser, Timer _timer) throws MetadataProviderException
{
this.parser = _parser;
// Lookup metadata from DB
}
}
这确实允许我动态读取 IdP 元数据。不过,当谈到刷新时,我的逻辑就崩溃了。我找到了this post on the spring forum,但它已经 3 到 4 岁了。动态读取、添加和更新 IdP 元数据、对其进行缓存并在某个时间间隔刷新缓存的最佳方式是什么?在我的情况下,数据库表中的 1 行将等同于单个 IdP 元数据定义。
【问题讨论】:
-
嗨吉姆,你能提供一个更新,你是怎么得到的?使用下面的示例?我还需要实现这个场景:)。
标签: spring metadata spring-saml