2011-01-12 13 views
9

He estado sacudiendo mi cabeza contra esto por un tiempo, y estoy empezando a progresar. Sin embargo, me encontré con algunos problemas para convertir una representación de cadena de una aserción SAML 2 (en XML) en un objeto de aserción.Creando Aserción de OpenSAML desde un XML dado en Java

Parece que estoy obteniendo un org.w3c.dom.Document válido con los datos apropiados, y parece que estoy obteniendo un SAMLObjectBuilder<Assertion> válido de la fábrica de constructores, pero cuando intento juntarlos todo lo que obtengo es una Afirmación en blanco; el sujeto, el emisor, el tiempo de emisión, etc. son null, a pesar de estar claramente establecidos 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, assertion.getSubject() vuelve 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.

La función loadXMLFromString() anterior está tomada en su mayoría de In Java, how do I parse XML as a String instead of a file?

+0

No editamos el nombre de la pregunta con '[SOLUCIONADO]' aquí. Si tiene su respuesta, márquela con la marca verde a la izquierda; su pregunta solo se marcará como "resuelta". – marcog

+0

@marcog Intenté eso al principio, pero no pude marcar mi propia respuesta como aceptada antes del final del período de gracia de 48 horas, y con toda la búsqueda que hice para encontrar una solución, pensé que era lo suficientemente relevante como para dejar la pregunta en torno en lugar de eliminarlo –

+1

Es genial que hayas publicado una auto-respuesta. Demasiadas personas simplemente se van. +1 a ambas preguntas y respuestas por hacerlo! – marcog

Respuesta

9

En caso alguien más enfrenta el mismo problema, y ​​se encuentra con esto, aquí está la respuesta.

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

acaba de tomar 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); 

Luego sustituye la instancia de documento para inCommonMDDoc y veamos el resultado de la final unmarshall() llamada. Tenga en cuenta que unmarshall() devuelve Object que debe convertir al tipo apropiado. Sugerencia: puede usar el uso de typeof si no está seguro de qué tipo es, pero tenga cuidado con la herencia.

+0

Mismo problema exacto, pero no estoy conectando los puntos. El resultado del unmarshall es un EntitiesDescriptor. ¿Cómo construyo un objeto saml a partir de eso? – stu

+1

@stu: el resultado de ummarshall es un objeto del mismo tipo que su elemento de documento raíz. En el ejemplo, es un EntitiesDescriptor, pero en su caso sería algún otro tipo de objeto SAML, como una Assertion. –

+0

Sí, gracias, finalmente me di cuenta de eso, lancé al objeto correcto y listo. Estaba bastante sorprendido de que todo funcionara. – stu