Создание утверждения OpenSAML из данного XML в Java

StackOverflow https://stackoverflow.com/questions/4667873

  •  10-10-2019
  •  | 
  •  

Вопрос

Я некоторое время избивал голову от этого и начинаю добиваться успеха. Тем не менее, я столкнулся с некоторыми проблемами преобразования строкового представления утверждения 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 Если вы не уверены, какой это тип, но следите за наследством.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top