web-dev-qa-db-ja.com

opensaml2.6から3.1.1に移行する方法

クラスをopensaml2.6からopensaml3.1.1に移行する必要がありますコンパイルいくつかのエラーが発生します

1)

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

新しいバージョンでクラスXMLHelperが見つかりません。

2)

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

デフォルトのBootstrapクラスが見つからず、getBuilderFactory()、getMarshallerFactory()メソッドを使用した構成クラスが見つかりません。

3)

BasicCredential credential = new BasicCredential();

これで、コンストラクターのnew BasicCredential()は表示されなくなります。

非推奨の兆候があるドキュメントは見つかりませんでした。このクラスをopensaml3.1.1バージョンに移植するにはどうすればよいですか?

15
Raffaele Fabbri

すでにopensaml3にアップグレードできたかどうかはわかりませんが、自分でアップグレードを試みているときにこれに遭遇したので、見つけたものを文書化するつもりだと思いました。

明らかに現時点では優先事項ではないため、ドキュメントはほとんどありません(ここでも言及されています: OpenSaml3ドキュメント )、私が見つけた最も便利な(完全ではない場合でも)ページは次のページです:- https://wiki.shibboleth.net/confluence/display/OS30/Initialization+and+Configuration

1)lib net.shibboleth.utilities:Java-supportにメソッドSerializeSupportを持つクラスprettyPrintXMLがあります

2)初期化はInitializationServiceを介して実行されるようになりました。

InitializationService.initialize();

XMLObjectProviderRegistrySupportを介してビルダー/マーシャラーを取得できます。例:

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

OpensamlがJava Service Provider APIを使用していることに注意してください。私の場合(OSGiバンドルorg.Apache.servicemix.bundles:org.Apache.servicemix.bundles.opensamlを使用)、SAMLアサーションを解析するためにSPI = config META-INF/services/org.opensaml.core.config.Initializerには、次のエントリが含まれています。

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:上記はテストでは機能しましたが、OSGiコンテナーでは実行されませんでした。 OSGiの回避策: OpenSAML3リソースがOSGiコンテナーに「default-config.xml」で見つかりません

標準ライブラリ(org.opensaml:opensaml-coreorg.opensaml:opensaml-saml-apiorg.opensaml:opensaml-saml-impl、...)を使用する場合、jarファイルとしてSPI configを追加する必要はありません。すでにSPI初期化用の標準構成の構成が含まれています。

3)lib org.opensaml:opensaml-security-apiにクラスBasicCredentialがあります。初期化中にキーを提供する代わりの方法は見当たりません。

20
Clauds

OS3を開発に使用する方法を学んでいます。これは、base 64samlリクエストをV3バージョンのSAMLObjectに変換する1つの例です。それがあなたを助けることができることを願っています。

プロジェクトを参照してください githubリポジトリ

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
Xin Meng