Domanda

Sono stato battendo la testa contro questo per un po ', e sto iniziando a fare progressi. Tuttavia, mi sono imbattuto in alcuni problemi conversione di una rappresentazione di stringa di un SAML 2 asserzione (in XML) a un oggetto Asserzione.

Sembra che sto ottenendo un org.w3c.dom.Document valida con i dati appropriati, e mi sembra di essere sempre un SAMLObjectBuilder<Assertion> valida dalla fabbrica costruttore, ma quando provo a mettere insieme tutto quello che ottiene è un'asserzione vuota; soggetto, emittente, il tempo di emissione e così via sono tutti null, loro malgrado chiaramente essendo impostato in XML.

Qualcuno vedere quello che 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, ritorna assertion.getSubject() 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.

La loadXMLFromString() funzione di cui sopra è in gran parte mutuato dal In Java, come faccio a XML parse come una stringa invece di un file?

È stato utile?

Soluzione

Nel caso in cui qualcun altro si trova ad affrontare lo stesso problema, e corre in 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 ed esaminare il risultato della chiamata unmarshall() finale. Si noti che unmarshall() restituisce un Object cui avete bisogno per fusione al tipo appropriato. Suggerimento:. È possibile utilizzare l'uso typeof se non siete sicuri che tipo è, ma attenzione per l'eredità

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top