2017-02-23 18 views
0

외부 파트너의 서비스를 사용하는 JAX-WS-Client를 구현해야합니다. 나는 Apache CXF를 사용한다. 이 서비스는 wsdl - KerberosToken 및 UsernameToken에서 인증을위한 두 개의 WS-Policy를 정의합니다. 서비스는 외부 파트너로부터 제공되므로 변경할 수 없습니다.JAX-WS 클라이언트 CXF WS- 정책 문제

문제 : 간단한 UsernameToken 인증을 사용하고 싶기 때문에 Kerberos 인증에서 인증이 실패합니다.

WSLD-정책 부 : CXF-엔드 포인트에서

<wsp:Policy xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" 
    xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" 
    wsu:Id="SecurityServiceUsernameUnsecureTransportPolicy"> 
    <wsp:ExactlyOne> 
    <wsp:All> 
    <sp:SupportingTokens xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702"> 
    <wsp:Policy> 
     <sp:KerberosToken sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient"> 
     <wsp:Policy> 
     <sp:WssGssKerberosV5ApReqToken11/> 
     </wsp:Policy> 
     </sp:KerberosToken> 
    </wsp:Policy> 
    </sp:SupportingTokens> 
    </wsp:All> 
    <wsp:All> 
    <sp:SupportingTokens xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702"> 
    <wsp:Policy> 
     <sp:UsernameToken sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient"> 
     <wsp:Policy> 
     <sp:WssUsernameToken10/> 
     </wsp:Policy> 
     </sp:UsernameToken> 
    </wsp:Policy> 
    </sp:SupportingTokens> 
    </wsp:All> 
    </wsp:ExactlyOne> 
</wsp:Policy> 

설정 아이디/비밀번호 :

public void addAuthenticationProperties(Endpoint endpoint) { 
    endpoint.put(SecurityConstants.USERNAME, userName); 
    endpoint.put(SecurityConstants.PASSWORD, password); 
} 

나는 태그 지정은 그 어떤 (excatly 한) 경우이의 의미 알고있는 것처럼 정책이 완전히 채워집니다. 그러나 CXF는 UsernameToken - Policy를 fullfill하려고 시도조차하지 않습니다.

KerberosToken 인증을위한 -Block을 제거해도 정상적으로 작동하지만 프로덕션에서는 불가능합니다.

힌트가 있습니까? wsdl 또는 내 접근 방식에 오류가 있으면 알려주십시오. 그리고 상세히 설명하십시오 - 나는이 분야에서 멍청하다.

미리 감사드립니다.

답변

0

며칠 후에 나는이 문제에 대한 해결 방법을 발견했다.

// creating Port 
URL url = new URL(config.getSchema(), config.getHost(), config.getPort(), config.getPath()); 

ExampleWS_Service service = new ExampleWS_Service(url); 
ExampleWS port = service.getExampleWSPort(); 

// Adding authentication-info 
Client client = ClientProxy.getClient(port); 
Endpoint cxfEndpoint = client.getEndpoint(); 

cxfEndpoint.put(SecurityConstants.USERNAME, userName); 
cxfEndpoint.put(SecurityConstants.PASSWORD, password); 

... 
// invoke service 
port.doSomething([data]); 

해결 : 그래서 모든게을 설정하고 서비스를 호출 할 ExampleWS_Service을 사용 을 나는 JaxWsProxyFactoryBean로 전환하고 모든게 좋을 꺼를 설정. 이 경우 요청 헤더에 인증 정보를 넣으려면 WSS4JOutInterceptor가 필요합니다. 일부 코드 : 정확히이 해결 방법이 실제로 작동하는 이유

URL url = new URL(config.getSchema(), config.getHost(), config.getPort(), config.getPath()); 

JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); 
factory.setServiceClass(ExampleWS.class); 
factory.setAddress(url.toString()); 
factory.setBindingId("http://schemas.xmlsoap.org/wsdl/soap12/"); 

ExampleWS port = (ExampleWS)factory.create(); 

// Adding authentication-info using WSS4JOutInterceptor 
Client client = ClientProxy.getClient(port); 
Endpoint cxfEndpoint = client.getEndpoint(); 

Map<String, Object> outProps = new HashMap<>(); 
outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN); 
outProps.put(WSHandlerConstants.USER, userName); 
outProps.put(WSHandlerConstants.PASSWORD_TYPE, passwordType); 
outProps.put(WSHandlerConstants.PW_CALLBACK_REF, [Instance of javax.security.auth.callback.CallbackHandler]); 

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

... 
// invoke service 
port.doSomething([data]); 

나도 몰라,하지만 :-) 은 아마 당신의 누군가가 나에게 이렇게 깨달음을 줄 수 않습니다.

0

CXF는 인바운드 측면에서만 보안을 위해 아웃 바운드 쪽에서 여러 정책 옵션을 처리하지 않습니다. 따라서 클라이언트가 사용하려는 정책에 따라 Kerberos 또는 UsernameToken으로 정책을 강화하는 것이 유일한 옵션입니다. CXF 클래스 ExampleWS_Service와 해당 인터페이스 ExampleWS 생성 : 먼저 이전 버전에서 솔루션 ;-)

를 호출 할 것이다 -

+0

Thanks Colm O hEigeartigh! 클라이언트에게이 정책을 무시하고 UsernameToken-Request를 보내도록 지시하는 방법이 있습니까? 서버 측이 외부 파트너에 의해 정의되었으므로 정책을 강화할 수 없습니다. –

+0

도움이 될 것입니다 : http://cxf.apache.org/ws-policy-framework.html. 기본적으로 첫 번째 정책 대안이 선택되지만이를 구성하는 방법이있을 수 있습니다. –

+0

Thx Colm O hEigeartigh! 나는 그것을 들여다 볼 것이다. 이 외에도 해결 방법을 발견했습니다. 어쩌면이 해결 방법에 찬반 양론을 줄 수 있습니다. –