9

一段时间以来,我一直在反对这一点,并且开始取得进展。但是,我在将 SAML 2 断言(在 XML 中)的字符串表示形式转换为断言对象时遇到了一些麻烦。

看起来我得到了一个org.w3c.dom.Document带有适当数据的有效数据,而且我似乎SAMLObjectBuilder<Assertion>从 builder factory 得到了一个有效数据,但是当我尝试将它们放在一起时,我得到的只是一个空白断言;主题、发行者、发行时间等都是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,表达式的其余部分失败。

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

上面的函数loadXMLFromString()主要是从 In Java 中借来的,如何将 XML 解析为字符串而不是文件?

4

1 回答 1

9

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

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如果你不确定它是什么类型,你可以使用 use,但要注意继承。

于 2011-01-12T14:24:00.743 回答