Создание утверждения 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 как строку, а не как файл?


person user    schedule 12.01.2011    source источник
comment
Мы не редактируем имя вопроса с [SOLVED] здесь. Если у вас есть ответ, отметьте его зеленой галочкой слева от него - только тогда ваш вопрос будет отмечен как решенный.   -  person moinudin    schedule 14.01.2011
comment
@marcog Сначала я попробовал это, но не смог отметить свой ответ как принятый до окончания 48-часового льготного периода, и, несмотря на все мои поиски решения, я подумал, что оно достаточно актуально, чтобы оставить вопрос. чем удалить его.   -  person user    schedule 25.01.2011
comment
Здорово, что вы разместили самостоятельный ответ. Слишком много людей просто уходят. +1 как к вопросу, так и к ответу за это!   -  person moinudin    schedule 25.01.2011


Ответы (1)


Если кто-то еще сталкивается с той же проблемой и сталкивается с ней, вот ответ.

https://wiki.shibboleth.net/confluence/display/OpenSAML/OSTwoUsrateMan

Возьмем простой пример:

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, если не уверены, какой это тип, но следите за наследованием.

person user    schedule 12.01.2011
comment
Та же самая проблема, но я не соединяю точки. Результатом демаршалинга является EntitiesDescriptor. Как мне создать на основе этого объект Saml? - person stu; 09.09.2011
comment
@stu: результат ummarshall - объект того же типа, что и ваш корневой элемент документа. В примере это EntitiesDescriptor, но в вашем случае это будет объект SAML другого типа, например Assertion. - person Doug Porter; 22.11.2011
comment
да, спасибо, в конце концов я это понял, применил к нужному объекту и вуаля. Я был весьма ошеломлен тем, что все это сработало. - person stu; 24.11.2011