2014-10-28 2 views
5

SOAP 서비스와 상호 작용하는 Java 애플리케이션이 있습니다. WSDL을 사용하여 CXF를 통해 Java 클라이언트를 생성했지만 ws-security를 ​​사용하여 호출을 인증해야합니다. 이 작업을 수행하는 코드 전용 방법을 찾고 있는데 xml 구성이 없습니다. 이것은 내가 시도한 것입니다 :WS-Security UsernameToken with Apache CXF

Map ctx = ((BindingProvider)port).getRequestContext(); 
ctx.put("ws-security.username", "joe"); 
ctx.put("ws-security.password", "joespassword"); 
port.makeSoapCall(); 

그러나 잘못된 WS-Security 헤더에 대한 구문 분석 오류가 발생합니다. 이 작업을 수행하는 올바른 방법은 무엇입니까? SOAP의 UI에서

, 나는 당신이 "WS-보안 한 번 봐 걸릴 수

답변

0

마우스 오른쪽 버튼으로 클릭"WSS UsernameToken이 추가 "를 클릭, 비누 머리글을 선택"암호 텍스트 "에 의해 쉽게 할 수 있습니다/ut "데모는 CXF와 함께 제공되며 사용자가 프로그래밍 방식으로 UsernameToken을 추가하는 방법을 보여줍니다.

https://git-wip-us.apache.org/repos/asf?p=cxf.git;a=blob_plain;f=distribution/src/main/release/samples/ws_security/ut/src/main/java/demo/wssec/client/Client.java;hb=HEAD

콤 다음은 클라이언트 코드입니다.

4

공유 한 코드에 따라 WS-SecurityPolicy를 사용하고 있습니다. WS-Security 만 사용하고 WSS4JOutInterceptor를 사용하여 usernametoken을 통해 전송하는 방법은 어떻습니까?

이 부분은 여기에 아파치 CFX WS-보안 가이드 " 이 API를 통해 인터셉터를 추가"확인 : http://cxf.apache.org/docs/ws-security.html

이 위의 위의 아파치 CXF documenation에 따라 수행해야 할 것입니다. 아웃 인터셉터 경로 만 필요할 수도 있습니다.

import org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor; 
import org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor; 
... 

Map<String,Object> inProps = new HashMap<String,Object>(); 
... // how to configure the properties is outlined below; 

WSS4JInInterceptor wssIn = new WSS4JInInterceptor(inProps); 
cxfEndpoint.getInInterceptors().add(wssIn); 

Map<String,Object> outProps = new HashMap<String,Object>(); 
outProps.put("action", "UsernameToken Timestamp"); 
outProps.put("passwordType", "PasswordDigest"); //remove this line if want to use plain text password 
outProps.put("user", "abcd"); 
outProps.put("passwordCallbackClass", "demo.wssec.client.UTPasswordCallback"); 

WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps); 
cxfEndpoint.getOutInterceptors().add(wssOut); 
:

import org.apache.cxf.frontend.ClientProxy; 
... 

GreeterService gs = new GreeterService(); 
Greeter greeter = gs.getGreeterPort(); 
... 
org.apache.cxf.endpoint.Client client = ClientProxy.getClient(greeter); 
org.apache.cxf.endpoint.Endpoint cxfEndpoint = client.getEndpoint(); 

지금 당신은 인터셉터를 추가 할 준비가 : 클라이언트 측에

, 당신은 ClientProxy 도우미를 사용하여 CXF 엔드 포인트에 대한 참조를 얻을 수 있습니다

위의 예에서 비밀번호 콜백 클래스 (UTPasswordCallback)를 작성해야합니다. 사용자 이름 토큰 및 UTPasswordCallback 코드에 대한 클라이언트 폴더 (SRC/메인/자바/데모/wssec/클라이언트)에 대한 위의 링크 찾아보기에서 http://svn.apache.org/repos/asf/cxf/trunk/distribution/src/main/release/samples/ws_security/ut/

:

아파치 CXF 토큰 여기에 사용자 이름에 대한 완전한 샘플이 있습니다.

EDIT : wsdl에서 암호를 일반 텍스트로 입력하는 경우 코드에서 다음 줄을 제거하십시오. outProps.put ("passwordType", "PasswordDigest");