2016-12-16 8 views
0

Я использую верблюд cxf для своих веб-сервисов и хочу проверить учетные данные хитов из пользовательского интерфейса мыла. Для чего я использую cxf-перехватчики, после чего учетные данные проверяются, но я не могу напечатать сообщение об ошибке в формате json/xml в ответе «Мыльный пользовательский интерфейс».Проблема регистрации сообщений ответа в SoapHeaderAuthentication с Camel CXF

Ниже мой план: -

<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> 

Ниже 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(); 
} 

}

Ответ мыльный UI: -

В формате XML: -

<xml/> 

В сырье: -

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) 

Может кто-нибудь поможет, как печатать сообщения об ошибках в мыльном UI, если я дать неправильные учетные данные?

+0

Может быть, я что-то не хватает, но где вы бросали 'Fault' в случае ошибки аутентификации? Кроме того, почему вы расширяете 'SoapHeaderInterceptor', если вы не используете его реализацию в любом месте вашего подкласса? Или вы? – Ralf

+0

Спасибо Ralf, пробовал с AbstractPhaseInterceptor с ошибкой вместо SoapHeaderAuthentication и получил ответ xml, как указано. Но я не могу преобразовать это в формат JSON. Возможно ли напечатать сообщение об ошибке в формате Json? – Som

+0

Ошибка сбоя = новая ошибка («Неверное имя пользователя или пароль для пользователя:» + policy.getUserName(), java.util.logging.Logger.getGlobal()); fault.setStatusCode (403); ошибка сброса; – Som

ответ