WS-Security
Stable • Since 0.14.0
Provides CXF framework’s WS-Security implementation.
Maven coordinates
Create a new project using quarkus-cxf-rt-ws-security
on code.quarkus.io
or add these coordinates to your existing project:
<dependency>
<groupId>io.quarkiverse.cxf</groupId>
<artifactId>quarkus-cxf-rt-ws-security</artifactId>
</dependency>
Check the User guide and especially its Dependency management section for more information about writing applications with CXF Extensions for Quarkus. |
Usage
The CXF framework’s WS-Security implementation is based on WSS4J. The example below shows how to integrate with WSS4J using interceptors.
Currently, only the programmatic WSS4JInterceptors are supported. Actions like Timestamp , UsernameToken , Signature , Encryption , etc., can be applied to the interceptors by passing the appropriate configuration properties.
|
A SOAP Service with WS-Security
Add the WSS4JInInterceptor
to in-interceptors
of your web service in application.properties
:
quarkus.cxf.endpoint."/rounder".in-interceptors = org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor
The sample code snippets used in this section come from the WS-Security server integration test in the source tree of CXF Extensions for Quarkus |
Then you can configure your WSS4JInInterceptor
using CDI like the following:
@ApplicationScoped
public class WSS4JInInterceptorProducer {
/** Produced in CxfWssServerTestResource */
@ConfigProperty(name = "wss.username", defaultValue = "cxf")
String username;
/** Produced in CxfWssServerTestResource */
@ConfigProperty(name = "wss.password", defaultValue = "pwd")
String password;
@Produces
@Unremovable
@ApplicationScoped
WSS4JInInterceptor wssInterceptor() {
final CallbackHandler passwordCallback = new CallbackHandler() {
@Override
public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
for (Callback callback : callbacks) {
if (callback instanceof WSPasswordCallback) {
final WSPasswordCallback pc = (WSPasswordCallback) callback;
if (username.equals(pc.getIdentifier())) {
pc.setPassword(password);
}
return;
}
}
}
};
final Map<String, Object> props = new HashMap<>();
props.put(ConfigurationConstants.ACTION, "UsernameToken");
props.put(ConfigurationConstants.PASSWORD_TYPE, "PasswordText");
props.put(ConfigurationConstants.USER, username);
props.put(ConfigurationConstants.PW_CALLBACK_REF, passwordCallback);
return new WSS4JInInterceptor(props);
}
}
A SOAP client using WS-Security
The corresponding client implementation would be slightly different:
we will use WSS4JOutInterceptor
and out-interceptors
in application.properties
:
quarkus.cxf.client."wss-client".out-interceptors=org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor
The sample code snippets used in this section come from the WS-Security client integration test in the source tree of CXF Extensions for Quarkus |
Then producing the WSS4JOutInterceptor
could look like the following.
@ApplicationScoped
public class WSS4JOutInterceptorProducer {
/** Produced in CxfWssClientTestResource */
@ConfigProperty(name = "wss.username")
String username;
/** Produced in CxfWssClientTestResource */
@ConfigProperty(name = "wss.password")
String password;
@Produces
@Unremovable
@ApplicationScoped
WSS4JOutInterceptor wssInterceptor() {
final CallbackHandler passwordCallback = new CallbackHandler() {
@Override
public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
for (Callback callback : callbacks) {
if (callback instanceof WSPasswordCallback) {
((WSPasswordCallback) callback).setPassword(password);
}
return;
}
}
};
final Map<String, Object> props = new HashMap<>();
props.put(ConfigurationConstants.ACTION, "UsernameToken");
props.put(ConfigurationConstants.PASSWORD_TYPE, "PasswordText");
props.put(ConfigurationConstants.USER, username);
props.put(ConfigurationConstants.PW_CALLBACK_REF, passwordCallback);
props.put(ConfigurationConstants.ADD_USERNAMETOKEN_NONCE, "true");
props.put(ConfigurationConstants.ADD_USERNAMETOKEN_CREATED, "true");
return new WSS4JOutInterceptor(props);
}
}
Please refer to WS-Security and WSS4J documentation for details.