2016-07-01 3 views
1

NTLM으로 인증 된 서비스에 연결하려고합니다. maven cxf plugin wsdl2java로 클라이언트를 생성했습니다. 예외가 있습니다 : org.apache.cxf.ws.policy.PolicyException : 정책 대안을 만족시킬 수 없습니다. 이 인증을 수행하는 또 다른 방법이있을 수 있습니다. WSDL에서Apache CXF 3.1.6 웹 서비스 클라이언트 - NTLM 인증

public class UFENTLM1Test { 

public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, ClassNotFoundException, InstantiationException { 
    System.out.println("UFE SERVICE TEST (NTLM No1 WRAPPER)"); 
    System.out.println("PARAMS: " + args[1] + " " + args[2] + " "); 
    System.out.println("START"); 

    Authenticator.setDefault(new Authenticator() { 
     @Override 
     protected PasswordAuthentication getPasswordAuthentication() { 
      return (new PasswordAuthentication(args[1], args[2].toCharArray())); 
     } 
    }); 
    //LAMAccountAPI service = new LAMAccountAPI(); 

    URL url = LAMAccountAPI.class.getClassLoader().getResource("wsdl/ufe/ufe_account.wsdl"); 

    // TO AVOID SEIStub cannot be cast to ClientProxy 
    LAMAccountAPI service = new LAMAccountAPI(url, LAMAccountAPI.SERVICE); 
    Field delegateField = Service.class.getDeclaredField("delegate"); 
    delegateField.setAccessible(true); 
    ServiceDelegate previousDelegate = (ServiceDelegate) delegateField.get(service); 
    if (!previousDelegate.getClass().getName().contains("cxf")) { 
     ServiceDelegate serviceDelegate = ((Provider) Class.forName("org.apache.cxf.jaxws.spi.ProviderImpl").newInstance()) 
       .createServiceDelegate(url, LAMAccountAPI.SERVICE, service.getClass()); 
     delegateField.set(service, serviceDelegate); 
    } 

    ILAMZarzadzanieKontem port = service.getBasicHttpBindingILAMZarzadzanieKontem(); 

    // Many various tryings 
    Client client = ClientProxy.getClient(port); 
    HTTPConduit http = (HTTPConduit) client.getConduit(); 
    http.getAuthorization().setUserName(args[1]); 
    http.getAuthorization().setPassword(args[2]); 
    AuthorizationPolicy policy = new AuthorizationPolicy(); 
    policy.setUserName(args[1]); 
    policy.setPassword(args[2]); 
    http.setAuthorization(policy); 
    HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy(); 
    httpClientPolicy.setConnectionTimeout(36000); 
    httpClientPolicy.setAllowChunking(false); 
    http.setClient(httpClientPolicy); 

    List<Konto> accounts = null; 
    try { 
     accounts = port.pobierzKonta().getKonto(); 
    } catch (ILAMZarzadzanieKontemPobierzKontaSOAPExceptionFaultMessage | ILAMZarzadzanieKontemPobierzKontaDataConversionExceptionFaultMessage ilamZarzadzanieKontemPobierzKontaSOAPExceptionFaultMessage) { 
     ilamZarzadzanieKontemPobierzKontaSOAPExceptionFaultMessage.printStackTrace(); 
    } 
} 

및 정책 정의 : 마지막으로

<wsp:Policy wsu:Id="BasicHttpBinding_ILAMZarzadzanieKontem_policy"> 
     <wsp:ExactlyOne> 
      <wsp:All> 
       <http:NtlmAuthentication xmlns:http="http://schemas.microsoft.com/ws/06/2004/policy/http"/> 
      </wsp:All> 
     </wsp:ExactlyOne> 
    </wsp:Policy> 

, 전체 스택 트레이스는 :

UFE SERVICE TEST (NTLM No1 WRAPPER) 
START 
lip 01, 2016 2:38:20 PM [com.sun.xml.internal.ws.policy.EffectiveAlternativeSelector] selectAlternatives 
WARNING: WSP0075: Policy assertion "{http://schemas.microsoft.com/ws/06/2004/policy/http}NtlmAuthentication" was evaluated as "UNKNOWN". 
lip 01, 2016 2:38:20 PM [com.sun.xml.internal.ws.policy.EffectiveAlternativeSelector] selectAlternatives 
WARNING: WSP0019: Suboptimal policy alternative selected on the client side with fitness "UNKNOWN". 
lip 01, 2016 2:38:21 PM org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean buildServiceFromWSDL 
INFO: Creating Service {http://tempuri.org/}LAMAccountAPI from WSDL: file:/C:/dev/work/compfort/warta/3639/iiq-connector/target/classes/wsdl/ufe/ufe_account.wsdl 
lip 01, 2016 2:38:22 PM org.apache.cxf.ws.policy.AssertionBuilderRegistryImpl handleNoRegisteredBuilder 
WARNING: No assertion builder for type {http://schemas.microsoft.com/ws/06/2004/policy/http}NtlmAuthentication registered. 
Exception in thread "main" org.apache.cxf.ws.policy.PolicyException: None of the policy alternatives can be satisfied. 
    at org.apache.cxf.ws.policy.EndpointPolicyImpl.chooseAlternative(EndpointPolicyImpl.java:172) 
    at org.apache.cxf.ws.policy.EndpointPolicyImpl.finalizeConfig(EndpointPolicyImpl.java:146) 
    at org.apache.cxf.ws.policy.EndpointPolicyImpl.initialize(EndpointPolicyImpl.java:142) 
    at org.apache.cxf.ws.policy.PolicyEngineImpl.createEndpointPolicyInfo(PolicyEngineImpl.java:604) 
    at org.apache.cxf.ws.policy.PolicyEngineImpl.getEndpointPolicy(PolicyEngineImpl.java:316) 
    at org.apache.cxf.ws.policy.PolicyEngineImpl.getClientEndpointPolicy(PolicyEngineImpl.java:303) 
    at org.apache.cxf.ws.policy.PolicyDataEngineImpl.getClientEndpointPolicy(PolicyDataEngineImpl.java:61) 
    at org.apache.cxf.transport.http.HTTPConduit.updateClientPolicy(HTTPConduit.java:318) 
    at org.apache.cxf.transport.http.HTTPConduit.updateClientPolicy(HTTPConduit.java:338) 
    at org.apache.cxf.transport.http.HTTPConduit.getClient(HTTPConduit.java:873) 
    at org.apache.cxf.transport.http.HTTPConduit.configureConduitFromEndpointInfo(HTTPConduit.java:360) 
    at org.apache.cxf.transport.http.HTTPConduit.finalizeConfig(HTTPConduit.java:440) 
    at org.apache.cxf.transport.http.HTTPTransportFactory.getConduit(HTTPTransportFactory.java:242) 
    at org.apache.cxf.binding.soap.SoapTransportFactory.getConduit(SoapTransportFactory.java:226) 
    at org.apache.cxf.binding.soap.SoapTransportFactory.getConduit(SoapTransportFactory.java:233) 
    at org.apache.cxf.endpoint.AbstractConduitSelector.createConduit(AbstractConduitSelector.java:145) 
    at org.apache.cxf.endpoint.AbstractConduitSelector.getSelectedConduit(AbstractConduitSelector.java:107) 
    at org.apache.cxf.endpoint.UpfrontConduitSelector.selectConduit(UpfrontConduitSelector.java:77) 
    at org.apache.cxf.endpoint.ClientImpl.getConduit(ClientImpl.java:845) 
    at pl.warta.connector.ufe.test.UFENTLM1Test.main(UFENTLM1Test.java:56) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 
+0

이 웹 서비스의 정책은 무엇입니까? – Frank

+0

@Frank WSDL에서 정책 정의를 추가했습니다. –

+0

비표준 정책처럼 보입니다. 그러면 또 다른 질문이 생깁니다. 오류는 어디에서 발생합니까? 서버 측 또는 클라이언트 측? stacktrace를 추가 할 수 있습니까? – Frank

답변

2

이 독점 WS-정책 태그 http:NtlmAuthentication에 문제가 있습니다. 문제는 cxf가 자동으로 ws-policy 요구 사항을 충족 시키려고 시도한다는 것입니다. 이 태그는 독점적이며 비표준이므로 오류가 발생하므로 예외가 발생합니다.

wsdl에서이 (전체) 정책을 제거하고이 정책없이 클라이언트를 다시 생성하십시오. 그 후 ntlm 인증이 작동해야합니다.

+0

주말로 인해 나는 월요일에 그것을 시험 할 것이다. 희망이 나를 도와;) –

관련 문제