2011-01-12 3 views
9

나는 잠시 동안 내 머리를 때리고 있었고, 진전을 보이기 시작했다. 그러나 SAML 2 어설 션 (XML)의 문자열 표현을 어설 션 개체로 변환하는 데 문제가 발생했습니다.주어진 XML에서 Java로 OpenSAML 어서션 생성하기

적절한 데이터가있는 유효한 org.w3c.dom.Document이 생성 된 것처럼 보입니다. 유효한 SAMLObjectBuilder<Assertion>을 빌더 팩토리에서 가져 오는 것처럼 보이지만 함께 가져 오려고하면 빈 어설 션이됩니다. 제목, 발급자, 발급 시간 등이 모두 null입니다.

누구나 내가 뭘 잘못하고 있는지 알고 해결책을 제안 할 수 있습니까? 표현의 나머지 부분에 실패한 nameID 할당에서

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

, assertion.getSubject() 반환 null.

내가 사용하고있는 예는 SSTC-SAML 기술 - 개요 - 2.0 초안-03, 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

에서 차용에서 전체 XML이다 다른 사람이 같은 문제에 직면하고 있으며,이 문제를 해결하기 위해 여기를 답니다.

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

은 그냥 비 정렬 화 예를 들자면 :
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); 

그런 다음 inCommonMDDoc에 대한 귀하의 문서 인스턴스를 대체하고 최종 unmarshall() 호출의 결과를 봐주세요. unmarshall()은 적절한 유형으로 변환해야하는 Object을 반환합니다. 힌트 : 유형이 확실하지 않은 경우 typeof을 사용할 수 있지만 상속에주의하십시오.

+0

정확하게 똑같은 문제가 있지만 점들을 연결하지 않습니다. unmarshall의 결과는 EntitiesDescriptor입니다. 어떻게 saml 객체를 만들 수 있습니까? – stu

+1

@stu : ummarshall의 결과는 루트 문서 요소와 동일한 유형의 개체입니다. 이 예제에서는 EntitiesDescriptor이지만 사용자의 경우 Assertion과 같은 다른 유형의 SAML Object가됩니다. –

+0

네, 고마워요. 결국 엔 그걸 알아 냈고, 올바른 물체와 짜잔에 던졌습니다. 나는 그것이 모두 효과가 있다는 것을 아주 기절시켰다. – stu