Pregunta

He estado golpeando mi cabeza contra esto durante un tiempo, y estoy empezando a hacer progresos. Sin embargo, me encontré con algunos problemas para convertir una representación de cadena de un SAML 2 aserción (en XML) a un objeto aserción.

Parece que me estoy haciendo un org.w3c.dom.Document válidos con datos apropiados, y me parece que esté recibiendo una SAMLObjectBuilder<Assertion> válida desde la fábrica constructor, pero cuando trato de ponerlos juntos todo lo que consigo es una aserción en blanco; tema, el emisor, el tiempo de emisión y así sucesivamente son todos null, a pesar de ellos siendo claramente establecido en el XML.

¿Alguien ve lo que estoy haciendo mal, y puede sugerir una solución?

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();

En la asignación NameID, devoluciones assertion.getSubject() null, en su defecto el resto de la expresión.

El ejemplo que estoy usando es el XML completo de SSTC-saml tecnología-panorama-2,0-proyecto-03, página 10.

El loadXMLFromString() función anterior es prestado principalmente de En Java, ¿cómo XML analizan como una cadena en lugar de un archivo?

¿Fue útil?

Solución

En caso de que alguien se enfrenta al mismo problema, y ??se ejecuta a través de este, aquí está la respuesta.

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

Simplemente tome el ejemplo 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);

A continuación, sustituir la instancia de documento para inCommonMDDoc y observe el resultado de la llamada unmarshall() final. Tenga en cuenta que unmarshall() devuelve un Object que necesita conversión al tipo apropiado. Pista:. Puedes utilizar typeof si no está seguro de qué tipo es, pero cuidado con la herencia

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top