Création OpenSAML Assertion de XML donné en Java
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?
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