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