2011-01-12 17 views
9

私はこれに対して私の頭をしばらく打ち倒しており、進歩し始めています。しかし、SAML 2アサーションの文字列表現(XML)をアサーションオブジェクトに変換する際に問題が発生しました。Javaの与えられたXMLからOpenSAMLアサーションを作成する

適切なデータで有効なorg.w3c.dom.Documentが表示されているようですが、有効なSAMLObjectBuilder<Assertion>がビルダーファクトリから取得されているようですが、それらをまとめてみると空白のアサーションが表示されます。件名、発行者、発行時間などがすべてnullであり、明確にXMLに設定されています。

私が間違っていることを誰に見ても解決策を提案できますか?式の残りの部分を失敗し、nullを返すassertion.getSubject()名前ID割り当て、で

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

私が使用している例は、10ページ

機能上記loadXMLFromString()はほとんどの場合In Java, how do I parse XML as a String instead of a file?

+0

ここで質問名は '[SOLVED]'で編集しません。答えが得られた場合は、その左側の緑色のチェックマークを付けてください。質問には「解決済み」と表示されます。 – marcog

+0

@marcog私はそれを最初に試みましたが、48時間の猶予期間が終わる前に受け入れられたように私自身の答えをマークすることはできませんでした。そして、解決のために私がしたすべての検索で、それを削除するのではなく。 –

+1

自己回答を投稿したことは素晴らしいことです。あまりにも多くの人々がちょうど歩き出す。 +1のために質問と回答をしてください! – marcog

答えて

9

から借用され、SSTC-SAMLハイテク-概要-2.0-ドラフト-03からの完全なXMLであります他の誰かが同じ問題に直面していて、これを横切って走っています。ここに答えがあります。

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

ただ、アンマーシャル例取る:inCommonMDDocのためにあなたのDocumentインスタンスを代用し、最終unmarshall()呼び出しの結果を見てその後

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

を。 unmarshall()は、適切な型にキャストする必要があるObjectを返します。ヒント:どんなタイプであるかわからない場合はtypeofを使用することができますが、継承に注意してください。

+0

同じ問題ですが、私はドットを接続していません。 unmarshallの結果はEntitiesDescriptorです。どのようにしてsamlオブジェクトを構築できますか? – stu

+1

@stu:ummarshallの結果は、ルートドキュメント要素と同じ型のオブジェクトです。この例では、EntitiesDescriptorですが、あなたのケースでは、アサーションのような他のタイプのSAMLオブジェクトになります。 –

+0

ええ、ありがとう、私は最終的にそれを考え出し、正しいオブジェクトとボイラにキャストしました。私はそれがすべて働いたことにとても驚きました。 – stu

関連する問題