Создание утверждения 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();

При присвоении nameID assertion.getSubject() возвращает null, не выполнив оставшуюся часть выражения.

Пример, который я использую, - это полный XML из sstc-saml-tech-overview-2.0-draft-03, Страница 10.

Функция loadXMLFromString() выше в основном заимствована из в Java, как я разбираю XML как строку вместо файла?

1 9

1 ответ:

В случае, если кто-то другой столкнется с той же проблемой и столкнется с этим, вот ответ.

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