在 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 断言的主要内容,如果未能解决你的问题,请参考以下文章
在 PHP 中从 DOMNode 创建 DOMDocument