Question

J'ai été battu ma tête contre ce pendant un certain temps, et je commence à faire des progrès. Cependant, je suis tombé sur des problèmes de conversion d'une représentation de chaîne d'un SAML 2 Assertion (en XML) à un objet Assertion.

On dirait que je reçois un org.w3c.dom.Document valide avec des données appropriées, et je semblent obtenir un SAMLObjectBuilder<Assertion> valide de l'usine de constructeur, mais lorsque je tente de les mettre ensemble tous Tracez votre I est un Assertion blanc; sujet, émetteur, le temps d'émission et ainsi de suite sont tous null, bien qu'ils soient clairement définis à XML.

Quelqu'un voit ce que je fais mal, et peut proposer une solution?

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

A l'affectation NameID, retourne assertion.getSubject() null, à défaut le reste de l'expression.

L'exemple que je suis en utilisant le XML complet de SSTC-saml-tech vue d'ensemble 2.0-projet-03, page 10.

La loadXMLFromString() fonction ci-dessus est la plupart du temps emprunté En Java, comment puis-je XML Parse comme une chaîne au lieu d'un fichier?

Était-ce utile?

La solution

Dans le cas où quelqu'un d'autre est confronté au même problème, et fonctionne à travers cela, voici la réponse.

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

Il suffit de prendre l'exemple 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);

Ensuite, remplacer votre instance de document pour inCommonMDDoc et regardez le résultat de l'appel unmarshall() final. Notez que revient unmarshall() un de Object que vous devez convertir le type approprié. Astuce:. Vous pouvez utiliser l'utilisation typeof si vous n'êtes pas sûr de quel type il est, mais attention à l'héritage

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top