2016-12-16 2 views
0

Ich benutze Camel CXF für meine Webservices und möchte die Anmeldeinformationen der Treffer von SOAP UI validieren. Für welche ich CXF-Interzeptoren verwende, post, welche Berechtigung validiert wird, aber ich bin nicht in der Lage, die Fehlermeldung in JSON/XML-Format in Soap UI-Antwort zu drucken.Antwortmeldung Protokoll Problem in SoapHeaderAuthentication mit Camel CXF

Unten ist mein Plan: -

<cxf:rsServer id="testingService" 
    address="http://127.0.0.1:8183/test/myWebserviceEndPoint" 
    serviceClass="com.test.SerFac"> 
    <cxf:providers> 
     <bean class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider" /> 
    </cxf:providers> 
    <cxf:inInterceptors> 
      <bean class="org.apache.cxf.interceptor.LoggingInInterceptor" /> 
      <bean class="com.test.BasicAuthAuthorizationInterceptor" /> 
    </cxf:inInterceptors> 
    <cxf:outInterceptors> 
      <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor" /> 
    </cxf:outInterceptors> 
</cxf:rsServer> 

Unten ist die BasicAuthAuthorizationInterceptor.java

public class BasicAuthAuthorizationInterceptor extends SoapHeaderInterceptor { 

protected Logger log = Logger.getLogger(getClass()); 

/** Map of allowed users to this system with their corresponding passwords. */ 
private Map<String,String> users; 

@Required 
public void setUsers(Map<String, String> users) { 
    this.users = users; 
} 

@Override public void handleMessage(Message message) throws Fault { 
    // This is set by CXF 
    AuthorizationPolicy policy = message.get(AuthorizationPolicy.class); 

    // If the policy is not set, the user did not specify credentials 
    // A 401 is sent to the client to indicate that authentication is required 
    if (policy == null) { 
     if (log.isDebugEnabled()) { 
      log.debug("User attempted to log in with no credentials"); 
     } 
     sendErrorResponse(message, HttpURLConnection.HTTP_UNAUTHORIZED); 
     return; 
    } 

    if (log.isDebugEnabled()) { 
     log.debug("Logging in use: " + policy.getUserName()); 
    } 

    // Verify the password 
    String realPassword = users.get(policy.getUserName()); 
    if (realPassword == null || !realPassword.equals(policy.getPassword())) { 
     log.error("Invalid username or password for user: " + policy.getUserName()); 

     sendErrorResponse(message, HttpURLConnection.HTTP_FORBIDDEN); 
    } 
} 

private void sendErrorResponse(Message message, int responseCode) { 
    Message outMessage = getOutMessage(message); 
    outMessage.put(Message.RESPONSE_CODE, responseCode); 

    // Set the response headers 
    Map<String, List<String>> responseHeaders = 
     (Map<String, List<String>>)message.get(Message.PROTOCOL_HEADERS); 
    if (responseHeaders != null) { 
     responseHeaders.put("WWW-Authenticate", Arrays.asList(new String[]{"Basic realm=realm"})); 
     responseHeaders.put("Content-Length", Arrays.asList(new String[]{"0"})); 
    } 
    message.getInterceptorChain().abort(); 
    try { 
     getConduit(message).prepare(outMessage); 
     close(outMessage); 
    } catch (IOException e) { 
     log.warn(e.getMessage(), e); 
    } 
} 

private Message getOutMessage(Message inMessage) { 
    Exchange exchange = inMessage.getExchange(); 
    Message outMessage = exchange.getOutMessage(); 
    if (outMessage == null) { 
     Endpoint endpoint = exchange.get(Endpoint.class); 
     outMessage = endpoint.getBinding().createMessage(); 
     exchange.setOutMessage(outMessage); 
    } 
    outMessage.putAll(inMessage); 
    return outMessage; 
} 

private Conduit getConduit(Message inMessage) throws IOException { 
    Exchange exchange = inMessage.getExchange(); 
    EndpointReferenceType target = exchange.get(EndpointReferenceType.class); 
    Conduit conduit = 
     exchange.getDestination().getBackChannel(inMessage, null, target); 
    exchange.setConduit(conduit); 
    return conduit; 
} 

private void close(Message outMessage) throws IOException { 
    OutputStream os = outMessage.getContent(OutputStream.class); 
    os.flush(); 
    os.close(); 
} 

}

Antwort von Seife UI: -

im XML-Format: -

<xml/> 

In roh: -

HTTP/1.1 403 Forbidden 
Accept-Encoding: gzip,deflate 
Authorization: Basic fLaWs3dvcmQ6cGFzc3dvcmQx 
Content-Length: 0 
Content-Type: application/json 
Host: localhost:8183 
User-Agent: Apache-HttpClient/4.1.1 (java 1.5) 
WWW-Authenticate: Basic realm=realm 
Server: Jetty(8.1.17.v20150415) 

Kann mir jemand helfen, wie die Fehlermeldungen in Seife UI zu drucken, wenn ich falsch Anmeldeinformationen geben?

+0

Vielleicht etwas, was ich bin fehlt, aber wo werfen Sie einen 'Fault' im Falle eines Authentifizierungsfehler? Warum erweitern Sie auch 'SoapHeaderInterceptor', wenn Sie seine Implementierung nirgends in Ihrer Unterklasse verwenden? Oder tust du? – Ralf

+0

Danke Ralf, versuchte mit AbstractPhaseInterceptor mit Fehler anstelle von SoapHeaderAuthentication und erhielt die XML-Antwort wie angegeben. Aber ich kann das nicht ins JSON-Format konvertieren. Ist es möglich, eine Fehlermeldung im Json-Format zu drucken? – Som

+0

Fehlerfehler = neu Fehler ("Ungültiger Benutzername oder ungültiges Kennwort für Benutzer:" + policy.getUserName(), java.util.logging.Logger.getGlobal()); Fehler.setStatusCode (403); Fehler werfen; – Som

Antwort