2011-01-12 13 views
9

Ho battuto la mia testa contro questo per un po ', e sto iniziando a fare progressi. Tuttavia, ho avuto qualche problema a convertire una rappresentazione di stringa di un'Asserzione SAML 2 (in XML) in un oggetto Assertion.Creazione di Asserzione OpenSAML da XML dato in Java

Sembra che io sono sempre una valida org.w3c.dom.Document con i dati appropriati, e mi sembra di essere sempre una valida SAMLObjectBuilder<Assertion> dalla fabbrica costruttore, ma quando provo a mettere insieme tutto quello che ottiene è un'asserzione vuota; soggetto, emittente, ora di rilascio e così via sono tutti null, nonostante siano chiaramente impostati nell'XML.

Qualcuno vede cosa sto facendo male e può suggerire una soluzione?

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

Al assegnazione NameID, assertion.getSubject() ritorni null, in mancanza il resto dell'espressione.

L'esempio che sto usando è la piena XML da CSST-SAML-tech-panoramica-2.0-draft-03, pagina 10.

sopra La funzione loadXMLFromString() è in gran parte preso in prestito da In Java, how do I parse XML as a String instead of a file?

+0

Non modificare il nome della domanda con '[SOLVED]' qui. Se hai la risposta, contrassegnala con il segno di spunta verde a sinistra - la tua domanda verrà quindi contrassegnata come "risolta". – marcog

+0

@marcog L'ho provato all'inizio, ma non ho potuto contrassegnare la mia risposta come accettata prima della fine del periodo di grazia di 48 ore, e con tutte le ricerche che ho fatto per una soluzione, ho pensato che fosse abbastanza rilevante da lasciare la domanda intorno piuttosto che eliminarlo. –

+1

È fantastico che tu abbia postato una risposta personale. Troppe persone si allontanano. +1 a entrambe le domande e risposte per farlo! – marcog

risposta

9

Nel caso in cui qualcun altro sta affrontando lo stesso problema, e attraversa questo, ecco la risposta.

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

Basta prendere l'esempio 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); 

quindi sostituire l'istanza di documento per inCommonMDDoc e guardare il risultato della unmarshall() chiamata finale. Si noti che unmarshall() restituisce un Object che è necessario eseguire il cast nel tipo appropriato. Suggerimento: puoi usare lo typeof se non sei sicuro di quale sia il tipo, ma fai attenzione all'ereditarietà.

+0

Stesso problema, ma non sto collegando i punti. Il risultato di unmarshall è un EntitiesDescriptor. Come faccio a costruire un oggetto saml da questo? – stu

+1

@stu: il risultato di ummarshall è un oggetto dello stesso tipo dell'elemento del documento radice. Nell'esempio è un EntitiesDescriptor ma nel tuo caso sarebbe un altro tipo di Oggetto SAML come un'Asserzione. –

+0

sì, alla fine l'ho capito, lanciato sull'oggetto giusto e voilà. Ero abbastanza sbalordito che tutto funzionasse. – stu