Создание утверждения OpenSAML из данного XML в Java
Вопрос
Я некоторое время избивал голову от этого и начинаю добиваться успеха. Тем не менее, я столкнулся с некоторыми проблемами преобразования строкового представления утверждения 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();
На имени назначения, assertion.getSubject()
возврат null
, сбой остаток выражения.
Пример, который я использую,-это полный XML от SSTC-SAML-Tech-Overview-2.0-DRAFT-03, стр. 10.
Функция loadXMLFromString()
Выше в основном заимствовано из В Java, как мне разобрать XML как строку вместо файла?
Решение
Если кто -то другой сталкивается с той же проблемой и работает через это, вот ответ.
https://wiki.shibboleth.net/confluence/display/opensaml/ostwousrmanjavacreatefromxml
Просто возьмите пример Unmarshalling:
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);
Затем замените экземпляр документа на inCommonMDDoc
и посмотрите на результат финала unmarshall()
вызов. Обратите внимание, что unmarshall()
возвращает Object
который вам нужно поднять на соответствующий тип. Подсказка: вы можете использовать использование typeof
Если вы не уверены, какой это тип, но следите за наследством.