我正在使用spring-security-saml扩展为基于spring的应用程序添加SSO支持。我们的想法是,IDP可以通过填写UI中的表单,指定他们的 entityId , SSO身份验证URL (用于SP初始化)来注册以在我的应用程序中使用SSO登录)和公共X.509证书。这似乎是支持SSO的SaaS应用程序的常用工作流程。
我还没有找到一个干净的方法来实现这个弹簧saml扩展,我想知道是否有一个。 FilesystemMetadataProvider
和HTTPMetadataProvider
分别支持从XML文件或HTTP GET加载IDP元数据,但我需要从存储在数据库中的上述属性生成IDP元数据。
我目前的想法是使用ResourceBackedMetadataProvider
并使用Resource
的实现为每个已注册的IDP从数据库中提取元数据属性。它看起来像是:
class DatabaseBackedResource implements Resource {
MetadataDao metadataDao; // autowired
public InputStream getInputStream() throws ResourceException {
Collection<MetadataPojo> idpMetadata = metadataDao.getMetadata();
return convertMetadataPojosToInputStream(idpMetadata);
}
private InputStream convertMetadataPojosToInputStream(Collection<MetadataPojo> metadata) {
// somehow convert attributes to XMLObject
// then write XMLObject to input stream
// ...
}
// implementations of other methods
// ...
}
其中MetadataPojo
只是IDP提供的上述3个属性的包装对象。我不确定的是如何使用spring saml扩展生成有效的IDP元数据java对象,给定一些属性。我看到AbstractMetadataProvider#unmarshallMetadata(InputStream)
将元数据输入流转换为XMLObject
,但我不清楚如何将我的MetadataPojo
集合转换为XMLObject
。< / p>
简而言之,在Spring saml扩展库中是否有一个工具可以在给定字符串属性列表的情况下构建IDP元数据xml对象?或者,退一步,是否有更好的方法来实现从数据库而不是文件或URL获取元数据信息的MetadataProvider
?
更新
我实现了上面的MetadataProvider
实现和Resource
子类,它的工作就像一个魅力。为了生成IDP元数据文档,我使用了AbstractSAMLObjectBuilder
的各种子类(即EntityDescriptorBuilder
,IDPSSODescriptorBuilder
,KeyDescriptorBuilder
等),并且工作非常干净。如果Spring SAML库有一个IDPMetadataGenerator
类,就像SP元数据中存在的MetadataGenerator
类那样会很好。
如果有更清洁的方法,我很乐意听到。