2016-03-04 23 views
8

devo migrare una classe da 2,6 a opensaml opensaml 3.1.1 compilazione ottengo alcuni erroricome migrare da 2,6 a opensaml 3.1.1

1)

Element plaintextElement = getElementAssertion(inputBean); 
String xml = XMLHelper.prettyPrintXML(plaintextElement); 

I cant't trova la classe XMLHelper nella nuova versione.

2)

DefaultBootstrap.bootstrap(); 
builderFactory = Configuration.getBuilderFactory(); 
Configuration.getMarshallerFactory().getMarshaller(assertion).marshall(assertion); 

ho can'f trovare la classe DefaultBootstrap e non riesco a trovare una configurazione di classe con i metodi getBuilderFactory(), getMarshallerFactory()

3)

BasicCredential credential = new BasicCredential(); 

Ora il contructor nuovo BasicCredential() non è visibile.

Non ho trovato documentazione con indicazione di deprecazione. Cosa devo fare per portare questa classe alla versione di opensaml 3.1.1?

Qualcuno può aiutarmi? Grazie in anticipo. Ci scusiamo per il mio pessimo inglese.

risposta

14

Non so se sei già riuscito ad aggiornare a opensaml 3 ma da quando mi sono imbattuto in questo mentre tentavo l'aggiornamento ho pensato di documentare ciò che ho trovato.

C'è molto poco di documentazione come apparentemente non è una priorità per loro al momento (anche qui menzionato: OpenSaml3 Documentation), la pagina più utile (anche se di gran lunga non completa) che ho trovato è questo: https://wiki.shibboleth.net/confluence/display/OS30/Initialization+and+Configuration

1) C'è una classe SerializeSupport con un metodo prettyPrintXML in lib net.shibboleth.utilities:java-support

2) inizializzazione viene ora fatto tramite InitializationService esempio

InitializationService.initialize(); 

È possibile recuperare il costruttore/marshaller via XMLObjectProviderRegistrySupport es .:

XMLObjectProviderRegistrySupport.getMarshallerFactory() 
XMLObjectProviderRegistrySupport.getBuilderFactory() 
XMLObjectProviderRegistrySupport.getUnmarshallerFactory() 

Ricordate che opensaml sta utilizzando l'API Service Provider Java. Nel mio caso (usando OSGi fascio org.apache.servicemix.bundles:org.apache.servicemix.bundles.opensaml) per l'analisi di un SAML ho aggiunto la configurazione SPI META-INF/services/org.opensaml.core.config.Initializer contenente le seguenti voci:

org.opensaml.core.xml.config.XMLObjectProviderInitializer 
org.opensaml.core.xml.config.GlobalParserPoolInitializer 
org.opensaml.saml.config.XMLObjectProviderInitializer 
org.opensaml.saml.config.SAMLConfigurationInitializer 
org.opensaml.xmlsec.config.XMLObjectProviderInitializer 

EDIT: Quanto sopra lavorato in una prova, ma non è stata eseguita nel contenitore OSGi . Soluzione per OSGi: OpenSAML3 resource not found 'default-config.xml' in OSGi container

Se si utilizzano le librerie standard (org.opensaml:opensaml-core, org.opensaml:opensaml-saml-api, org.opensaml:opensaml-saml-impl, ...) potrebbe non essere necessario aggiungere qualsiasi configurazione SPI come i vasetti contengono già file di configurazione SPI con una configurazione standard per l'inizializzazione.

3) C'è una classe BasicCredential in lib org.opensaml:opensaml-security-api. Non vedo un'alternativa a fornire una chiave durante l'initalizzazione.

+0

Così quello che potrebbe essere il motivo per cui ho ancora ottenere nulla invece della (dis) marshaller dalla fabbrica? 'XMLObjectProviderRegistrySupport.getMarshallerFactory(). GetMarshaller (authnRequest.getElementQName())' – Gobliins

+0

Hai 'InitializationService.initialize();'? –

+0

C'è qualche codice di esempio utile su https://git.shibboleth.net/view/?p=java-opensaml.git;a=blob;f=opensaml-saml-impl/src/test/java/org/opensaml/ saml/SAML2/metadati/MetadataTest.java; hb = HEAD. Si noti che parte dell'inizializzazione si trova nella superclasse in 'org.opensaml.core.xml.XMLObjectBaseTestCase # initXMLObjectSupport' che a sua volta eredita da' OpenSAMLInitBaseTestCase' (non fa altro che 'InitializationService.initialize()'). –

0

Sto imparando come utilizzare l'OS3 per lo sviluppo. Questo è un esempio per convertire la richiesta saml di base 64 in SAMLObject nella versione V3. Spero possa aiutarti.

Il progetto vede the github repository

public class SAMLToolkit { 

    public static SAMLObject convertBase64ToSaml(String base64Str) { 
     byte[] decodedBytes = new byte[0]; 
     try { 
      decodedBytes = Base64.decode(base64Str); 
     } catch (Base64DecodingException e) { 
      e.printStackTrace(); 
      return null; 
     } 

     InputStream is = new ByteArrayInputStream(decodedBytes); 
     //is = new InflaterInputStream(is, new Inflater(true)); 
     try { 

      InitializationService.initialize(); 
      Document messageDoc; 
      BasicParserPool basicParserPool = new BasicParserPool(); 
      basicParserPool.initialize(); 
      messageDoc = basicParserPool.parse(is); 
      Element messageElem = messageDoc.getDocumentElement(); 
      Unmarshaller unmarshaller = XMLObjectProviderRegistrySupport.getUnmarshallerFactory().getUnmarshaller(messageElem); 

      assert unmarshaller != null; 
      return(SAMLObject) unmarshaller.unmarshall(messageElem); 
     } catch (InitializationException e) { 
      e.printStackTrace(); 
      return null; 
     } catch (XMLParserException e) { 
      e.printStackTrace(); 
      return null; 
     } catch (UnmarshallingException e) { 
      e.printStackTrace(); 
      return null; 
     } catch (ComponentInitializationException e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 
} 
+0

Questo non funzionerebbe per me a meno che non aggiungo anche "/ META-INF/services/org.opensaml.core.config.Initializer" che contiene la configurazione mostrata da @Clauds. –