如何实现从数据库读取的MetadataProvider

时间:2015-12-16 17:30:27

标签: spring-security saml-2.0 spring-saml

我正在使用spring-security-saml扩展为基于spring的应用程序添加SSO支持。我们的想法是,IDP可以通过填写UI中的表单,指定他们的 entityId SSO身份验证URL (用于SP初始化)来注册以在我的应用程序中使用SSO登录)和公共X.509证书。这似乎是支持SSO的SaaS应用程序的常用工作流程。

我还没有找到一个干净的方法来实现这个弹簧saml扩展,我想知道是否有一个。 FilesystemMetadataProviderHTTPMetadataProvider分别支持从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的各种子类(即EntityDescriptorBuilderIDPSSODescriptorBuilderKeyDescriptorBuilder等),并且工作非常干净。如果Spring SAML库有一个IDPMetadataGenerator类,就像SP元数据中存在的MetadataGenerator类那样会很好。

如果有更清洁的方法,我很乐意听到。

0 个答案:

没有答案