2017-02-23 12 views
0

外部パートナーからのサービスを使用するJAX-WS-Clientを実装する必要があります。私はApache CXFを使用します。このサービスは、wsdl - KerberosTokenとUsernameTokenの認証用に2つのWS-Policyを定義しています。サービスは外部パートナーからのものであるため変更できません。JAX-WSクライアントCXF WS-Policyの問題

問題:簡単な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); 
} 

私は-Tagの意味を理解すると、もしあれば(excatly 1)本のことポリシーは満場一致で実行されます。しかし、CXFはUsernameToken - Policyをフルフィルにしようとしません。

KerberosToken認証用の-Blockを削除しても問題なく動作しますが、これは不可能です。

ヒントwsdlまたは私のアプローチでエラーが発生した場合は、私に知らせてください。そして、詳細を述べてください - 私はこの分野のノブです。

ありがとうございます!

答えて

0

数日後、私はこの問題の回避策を見つけました。だから私はeverthingを設定し、サービスを呼び出すためにExampleWS_Serviceを使用:

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

回避策: 私はJaxWsProxyFactoryBeanに切り替えてeverthingを設定します。この場合、WSS4JOutInterceptorは、認証情報をrequest-headerに入れるために必要です。いくつかのコードは:まさにこの回避策が実際に動作する理由

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!私はそれを調べるでしょう。 これ以外にも回避策が見つかりました。おそらく、あなたはこの回避策にいくつかの賛否両論を与えることができます。 –

関連する問題