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