在 Java 中从给定的 XML 创建 OpenSAML 断言

Posted

技术标签:

【中文标题】在 Java 中从给定的 XML 创建 OpenSAML 断言【英文标题】:Creating OpenSAML Assertion from given XML in Java 【发布时间】:2011-06-07 18:16:00 【问题描述】:

我已经为此苦苦挣扎了一段时间,并且开始取得进展。但是,我在将 SAML 2 断言(在 XML 中)的字符串表示形式转换为断言对象时遇到了一些麻烦。

看起来我得到了一个带有适当数据的有效org.w3c.dom.Document,而且我似乎从构建器工厂得到了一个有效的SAMLObjectBuilder<Assertion>,但是当我尝试将它们放在一起时,我得到的只是一个空白断言;主题、发行者、发行时间等都是null,尽管它们在 XML 中明确设置。

有没有人看到我做错了什么,并可以提出解决方案?

Document doc = loadXMLFromString(saml);

XMLObjectBuilderFactory builderFactory = Configuration.getBuilderFactory();

SAMLObjectBuilder<Assertion> assertionBuilder =
  (SAMLObjectBuilder<Assertion>)
  builderFactory.getBuilder(Assertion.DEFAULT_ELEMENT_NAME);

Assertion assertion = assertionBuilder.buildObject(doc.getDocumentElement());

String nameID = assertion.getSubject().getNameID().getValue();

在 nameID 分配时,assertion.getSubject() 返回 null,表达式的其余部分失败。

我使用的示例是来自 sstc-saml-tech-overview-2.0-draft-03,第 10 页的完整 XML。

上面的函数loadXMLFromString()多是借用In Java, how do I parse XML as a String instead of a file?

【问题讨论】:

我们不会在这里编辑带有[SOLVED] 的问题名称。如果您有答案,请在其左侧标上绿色勾号 - 您的问题才会被标记为“已解决”。 @marcog 我起初尝试过,但在 48 小时宽限期结束之前无法将我自己的答案标记为已接受,并且在我为解决方案所做的所有搜索中,我认为它是相关性足以留下问题而不是删除它。 很高兴您发布了一个自我回答。太多人只是走开。这样做的问题和答案都 +1! 【参考方案1】:

如果其他人遇到同样的问题,遇到这个问题,这里就是答案。

https://wiki.shibboleth.net/confluence/display/OpenSAML/OSTwoUsrManJavaCreateFromXML

以解组为例:

String inCommonMDFile = "/data/org/opensaml/saml2/metadata/InCommon-metadata.xml";

// Initialize the library
DefaultBootstrap.bootstrap(); 

// Get parser pool manager
BasicParserPool ppMgr = new BasicParserPool();
ppMgr.setNamespaceAware(true);

// Parse metadata file
InputStream in = MetadataTest.class.getResourceAsStream(inCommonMDFile);
Document inCommonMDDoc = ppMgr.parse(in);
Element metadataRoot = inCommonMDDoc.getDocumentElement();

// Get apropriate unmarshaller
UnmarshallerFactory unmarshallerFactory = Configuration.getUnmarshallerFactory();
Unmarshaller unmarshaller = unmarshallerFactory.getUnmarshaller(metadataRoot);

// Unmarshall using the document root element, an EntitiesDescriptor in this case
EntitiesDescriptor inCommonMD = (EntitiesDescriptor) unmarshaller.unmarshall(metadataRoot);

然后将您的 Document 实例替换为 inCommonMDDoc 并查看最终的 unmarshall() 调用的结果。请注意,unmarshall() 返回一个 Object,您需要将其转换为适当的类型。提示:如果你不确定它是什么类型,你可以使用typeof,但要注意继承。

【讨论】:

同样的问题,但我没有连接这些点。解组的结果是一个 EntityDescriptor。我如何从中构建一个 saml 对象? @stu:ummarshall 的结果是与您的根文档元素类型相同的对象。在示例中,它是一个 EntitiesDescriptor,但在您的情况下,它将是某种其他类型的 SAML 对象,例如断言。 是的,谢谢,我最终想通了,投射到正确的对象上,瞧。我很惊讶这一切都奏效了。

以上是关于在 Java 中从给定的 XML 创建 OpenSAML 断言的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Java 中从 XML 创建 PDF?

在 Eclipse 中从 XML 生成 Java 代码

在 HIVE 中从给定的开始和结束日期创建一个序列数组

在 PHP 中从 DOMNode 创建 DOMDocument

尝试在 Java Spring Boot 中从 H2 数据库中获取相关实体

如何在 Maven 中从 pom.xml 调用 testng.xml 文件