package org.superbiz.calculator;
import jakarta.annotation.security.DeclareRoles;
import jakarta.annotation.security.RolesAllowed;
import jakarta.ejb.Stateless;
import jakarta.jws.WebService;
/**
* This is an EJB 3 style pojo stateless session bean
* Every stateless session bean implementation must be annotated
* using the annotation @Stateless
* This EJB has a single interface: CalculatorWs a webservice interface.
*/
//START SNIPPET: code
@DeclareRoles(value = {"Administrator"})
@Stateless
@WebService(
portName = "CalculatorPort",
serviceName = "CalculatorWsService",
targetNamespace = "http://superbiz.org/wsdl",
endpointInterface = "org.superbiz.calculator.CalculatorWs")
public class CalculatorImpl implements CalculatorWs, CalculatorRemote {
@RolesAllowed(value = {"Administrator"})
public int sum(int add1, int add2) {
return add1 + add2;
}
public int multiply(int mul1, int mul2) {
return mul1 * mul2;
}
}
Webservice Ws Security
Help us document this example! Click the blue pencil icon in the upper right to edit this page.
CalculatorImpl
CalculatorRemote
package org.superbiz.calculator;
import jakarta.ejb.Remote;
@Remote
public interface CalculatorRemote {
public int sum(int add1, int add2);
public int multiply(int mul1, int mul2);
}
CalculatorWs
package org.superbiz.calculator;
import jakarta.jws.WebService;
//END SNIPPET: code
/**
* This is an EJB 3 webservice interface
* A webservice interface must be annotated with the @Local
* annotation.
*/
//START SNIPPET: code
@WebService(targetNamespace = "http://superbiz.org/wsdl")
public interface CalculatorWs {
public int sum(int add1, int add2);
public int multiply(int mul1, int mul2);
}
ejb-jar.xml
<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd"
version="3.0" id="simple" metadata-complete="false">
<enterprise-beans>
<session>
<ejb-name>CalculatorImplTimestamp1way</ejb-name>
<service-endpoint>org.superbiz.calculator.CalculatorWs</service-endpoint>
<ejb-class>org.superbiz.calculator.CalculatorImpl</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
<session>
<ejb-name>CalculatorImplTimestamp2ways</ejb-name>
<service-endpoint>org.superbiz.calculator.CalculatorWs</service-endpoint>
<ejb-class>org.superbiz.calculator.CalculatorImpl</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
<session>
<ejb-name>CalculatorImplUsernameTokenPlainPassword</ejb-name>
<service-endpoint>org.superbiz.calculator.CalculatorWs</service-endpoint>
<ejb-class>org.superbiz.calculator.CalculatorImpl</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
<session>
<ejb-name>CalculatorImplUsernameTokenHashedPassword</ejb-name>
<service-endpoint>org.superbiz.calculator.CalculatorWs</service-endpoint>
<ejb-class>org.superbiz.calculator.CalculatorImpl</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
<session>
<ejb-name>CalculatorImplUsernameTokenPlainPasswordEncrypt</ejb-name>
<service-endpoint>org.superbiz.calculator.CalculatorWs</service-endpoint>
<ejb-class>org.superbiz.calculator.CalculatorImpl</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
<session>
<ejb-name>CalculatorImplSign</ejb-name>
<service-endpoint>org.superbiz.calculator.CalculatorWs</service-endpoint>
<ejb-class>org.superbiz.calculator.CalculatorImpl</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
<session>
<ejb-name>CalculatorImplEncrypt2ways</ejb-name>
<service-endpoint>org.superbiz.calculator.CalculatorWs</service-endpoint>
<ejb-class>org.superbiz.calculator.CalculatorImpl</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
<session>
<ejb-name>CalculatorImplSign2ways</ejb-name>
<service-endpoint>org.superbiz.calculator.CalculatorWs</service-endpoint>
<ejb-class>org.superbiz.calculator.CalculatorImpl</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
<session>
<ejb-name>CalculatorImplEncryptAndSign2ways</ejb-name>
<service-endpoint>org.superbiz.calculator.CalculatorWs</service-endpoint>
<ejb-class>org.superbiz.calculator.CalculatorImpl</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
</enterprise-beans>
</ejb-jar>
openejb-jar.xml
<openejb-jar xmlns="http://www.openejb.org/openejb-jar/1.1">
<ejb-deployment ejb-name="CalculatorImpl">
<properties>
# webservice.security.realm
# webservice.security.securityRealm
# webservice.security.transportGarantee = NONE
webservice.security.authMethod = WS-SECURITY
wss4j.in.action = UsernameToken
wss4j.in.passwordType = PasswordText
wss4j.in.passwordCallbackClass = org.superbiz.calculator.CustomPasswordHandler
# automatically added
wss4j.in.validator.{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd}UsernameToken = org.apache.openejb.server.cxf.OpenEJBLoginValidator
</properties>
</ejb-deployment>
<ejb-deployment ejb-name="CalculatorImplTimestamp1way">
<properties>
webservice.security.authMethod = WS-SECURITY
wss4j.in.action = Timestamp
</properties>
</ejb-deployment>
<ejb-deployment ejb-name="CalculatorImplTimestamp2ways">
<properties>
webservice.security.authMethod = WS-SECURITY
wss4j.in.action = Timestamp
wss4j.out.action = Timestamp
</properties>
</ejb-deployment>
<ejb-deployment ejb-name="CalculatorImplUsernameTokenPlainPassword">
<properties>
webservice.security.authMethod = WS-SECURITY
wss4j.in.action = UsernameToken
wss4j.in.passwordType = PasswordText
wss4j.in.passwordCallbackClass=org.superbiz.calculator.CustomPasswordHandler
</properties>
</ejb-deployment>
<ejb-deployment ejb-name="CalculatorImplUsernameTokenHashedPassword">
<properties>
webservice.security.authMethod = WS-SECURITY
wss4j.in.action = UsernameToken
wss4j.in.passwordType = PasswordDigest
wss4j.in.passwordCallbackClass=org.superbiz.calculator.CustomPasswordHandler
</properties>
</ejb-deployment>
<ejb-deployment ejb-name="CalculatorImplUsernameTokenPlainPasswordEncrypt">
<properties>
webservice.security.authMethod = WS-SECURITY
wss4j.in.action = UsernameToken Encrypt
wss4j.in.passwordType = PasswordText
wss4j.in.passwordCallbackClass=org.superbiz.calculator.CustomPasswordHandler
wss4j.in.decryptionPropFile = META-INF/CalculatorImplUsernameTokenPlainPasswordEncrypt-server.properties
</properties>
</ejb-deployment>
<ejb-deployment ejb-name="CalculatorImplSign">
<properties>
webservice.security.authMethod = WS-SECURITY
wss4j.in.action = Signature
wss4j.in.passwordCallbackClass=org.superbiz.calculator.CustomPasswordHandler
wss4j.in.signaturePropFile = META-INF/CalculatorImplSign-server.properties
</properties>
</ejb-deployment>
</openejb-jar>
webservices.xml
<webservices xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://www.ibm.com/webservices/xsd/j2ee_web_services_1_1.xsd"
xmlns:ger="http://ciaows.org/wsdl" version="1.1">
<webservice-description>
<webservice-description-name>CalculatorWsService</webservice-description-name>
<port-component>
<port-component-name>CalculatorImplTimestamp1way</port-component-name>
<wsdl-port>CalculatorImplTimestamp1way</wsdl-port>
<service-endpoint-interface>org.superbiz.calculator.CalculatorWs</service-endpoint-interface>
<service-impl-bean>
<ejb-link>CalculatorImplTimestamp1way</ejb-link>
</service-impl-bean>
</port-component>
<port-component>
<port-component-name>CalculatorImplTimestamp2ways</port-component-name>
<wsdl-port>CalculatorImplTimestamp2ways</wsdl-port>
<service-endpoint-interface>org.superbiz.calculator.CalculatorWs</service-endpoint-interface>
<service-impl-bean>
<ejb-link>CalculatorImplTimestamp2ways</ejb-link>
</service-impl-bean>
</port-component>
<port-component>
<port-component-name>CalculatorImplUsernameTokenPlainPassword</port-component-name>
<wsdl-port>CalculatorImplUsernameTokenPlainPassword</wsdl-port>
<service-endpoint-interface>org.superbiz.calculator.CalculatorWs</service-endpoint-interface>
<service-impl-bean>
<ejb-link>CalculatorImplUsernameTokenPlainPassword</ejb-link>
</service-impl-bean>
</port-component>
<port-component>
<port-component-name>CalculatorImplUsernameTokenHashedPassword</port-component-name>
<wsdl-port>CalculatorImplUsernameTokenHashedPassword</wsdl-port>
<service-endpoint-interface>org.superbiz.calculator.CalculatorWs</service-endpoint-interface>
<service-impl-bean>
<ejb-link>CalculatorImplUsernameTokenHashedPassword</ejb-link>
</service-impl-bean>
</port-component>
<port-component>
<port-component-name>CalculatorImplUsernameTokenPlainPasswordEncrypt</port-component-name>
<wsdl-port>CalculatorImplUsernameTokenPlainPasswordEncrypt</wsdl-port>
<service-endpoint-interface>org.superbiz.calculator.CalculatorWs</service-endpoint-interface>
<service-impl-bean>
<ejb-link>CalculatorImplUsernameTokenPlainPasswordEncrypt</ejb-link>
</service-impl-bean>
</port-component>
</webservice-description>
</webservices>
CalculatorTest
package org.superbiz.calculator;
import org.apache.cxf.binding.soap.saaj.SAAJInInterceptor;
import org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.endpoint.Endpoint;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor;
import org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor;
import org.apache.wss4j.common.ext.WSPasswordCallback;
import org.apache.wss4j.dom.WSConstants;
import org.apache.wss4j.dom.handler.WSHandlerConstants;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.arquillian.test.api.ArquillianResource;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.ClassLoaderAsset;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.junit.Test;
import org.junit.runner.RunWith;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;
import javax.xml.namespace.QName;
import jakarta.xml.ws.Service;
import jakarta.xml.ws.soap.SOAPBinding;
import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
@RunWith(Arquillian.class)
public class CalculatorTest {
//START SNIPPET: setup
@ArquillianResource
private URL base;
@Deployment(testable = false)
public static WebArchive war() {
return ShrinkWrap.create(WebArchive.class, "webservice-ws-security.war")
.addClasses(CalculatorImpl.class, CalculatorRemote.class, CalculatorWs.class, CustomPasswordHandler.class)
.addAsWebInfResource(new ClassLoaderAsset("META-INF/ejb-jar.xml"), "ejb-jar.xml")
.addAsWebInfResource(new ClassLoaderAsset("META-INF/openejb-jar.xml"), "openejb-jar.xml")
.addAsWebInfResource(new ClassLoaderAsset("META-INF/webservices.xml"), "webservices.xml")
.addAsResource("META-INF/CalculatorImplSign-server.properties")
.addAsResource("META-INF/CalculatorImplUsernameTokenPlainPasswordEncrypt-server.properties")
.addAsResource("META-INF/serverStore.jks");
}
//END SNIPPET: setup
//START SNIPPET: webservice
@Test
public void testCalculatorViaWsInterface() throws Exception {
final Service calcService = Service.create(new URL(base.toExternalForm() + "webservices/CalculatorImpl?wsdl"),
new QName("http://superbiz.org/wsdl", "CalculatorWsService"));
assertNotNull(calcService);
final CalculatorWs calc = calcService.getPort(CalculatorWs.class);
final Client client = ClientProxy.getClient(calc);
final Endpoint endpoint = client.getEndpoint();
endpoint.getOutInterceptors().add(new SAAJOutInterceptor());
final Map<String, Object> outProps = new HashMap<>();
outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
outProps.put(WSHandlerConstants.USER, "jane");
outProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
outProps.put(WSHandlerConstants.PW_CALLBACK_REF, new CallbackHandler() {
@Override
public void handle(final Callback[] callbacks) throws IOException, UnsupportedCallbackException {
final WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
pc.setPassword("waterfall");
}
});
final WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps);
endpoint.getOutInterceptors().add(wssOut);
assertEquals(10, calc.sum(4, 6));
}
@Test
public void testCalculatorViaWsInterfaceFactoryBean() throws Exception {
final JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(CalculatorWs.class);
factory.setAddress(base.toExternalForm() + "webservices/CalculatorImpl");
final CalculatorWs calc = (CalculatorWs) factory.create();
final Client client = ClientProxy.getClient(calc);
final Endpoint endpoint = client.getEndpoint();
endpoint.getOutInterceptors().add(new SAAJOutInterceptor());
final Map<String, Object> outProps = new HashMap<>();
outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
outProps.put(WSHandlerConstants.USER, "jane");
outProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
outProps.put(WSHandlerConstants.PW_CALLBACK_REF, new CallbackHandler() {
@Override
public void handle(final Callback[] callbacks) throws IOException, UnsupportedCallbackException {
final WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
pc.setPassword("waterfall");
}
});
final WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps);
endpoint.getOutInterceptors().add(wssOut);
assertEquals(10, calc.sum(4, 6));
}
@Test
public void testCalculatorViaWsInterfaceWithTimestamp1way() throws Exception {
final Service calcService = Service.create(new URL(base.toExternalForm() + "webservices/CalculatorImplTimestamp1way?wsdl"),
new QName("http://superbiz.org/wsdl", "CalculatorWsService"));
assertNotNull(calcService);
// for debugging (ie. TCPMon)
calcService.addPort(new QName("http://superbiz.org/wsdl",
"CalculatorWsService2"), SOAPBinding.SOAP12HTTP_BINDING,
"http://127.0.0.1:8204/CalculatorImplTimestamp1way");
// CalculatorWs calc = calcService.getPort(
// new QName("http://superbiz.org/wsdl", "CalculatorWsService2"),
// CalculatorWs.class);
final CalculatorWs calc = calcService.getPort(CalculatorWs.class);
final Client client = ClientProxy.getClient(calc);
final Endpoint endpoint = client.getEndpoint();
endpoint.getOutInterceptors().add(new SAAJOutInterceptor());
final Map<String, Object> outProps = new HashMap<String, Object>();
outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.TIMESTAMP);
final WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps);
endpoint.getOutInterceptors().add(wssOut);
assertEquals(12, calc.multiply(3, 4));
}
@Test
public void testCalculatorViaWsInterfaceWithTimestamp2ways() throws Exception {
final Service calcService = Service.create(new URL(base.toExternalForm() + "webservices/CalculatorImplTimestamp2ways?wsdl"),
new QName("http://superbiz.org/wsdl", "CalculatorWsService"));
assertNotNull(calcService);
// for debugging (ie. TCPMon)
calcService.addPort(new QName("http://superbiz.org/wsdl",
"CalculatorWsService2"), SOAPBinding.SOAP12HTTP_BINDING,
"http://127.0.0.1:8204/CalculatorImplTimestamp2ways");
// CalculatorWs calc = calcService.getPort(
// new QName("http://superbiz.org/wsdl", "CalculatorWsService2"),
// CalculatorWs.class);
final CalculatorWs calc = calcService.getPort(CalculatorWs.class);
final Client client = ClientProxy.getClient(calc);
final Endpoint endpoint = client.getEndpoint();
endpoint.getOutInterceptors().add(new SAAJOutInterceptor());
endpoint.getInInterceptors().add(new SAAJInInterceptor());
final Map<String, Object> outProps = new HashMap<String, Object>();
outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.TIMESTAMP);
final WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps);
endpoint.getOutInterceptors().add(wssOut);
final Map<String, Object> inProps = new HashMap<String, Object>();
inProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.TIMESTAMP);
final WSS4JInInterceptor wssIn = new WSS4JInInterceptor(inProps);
endpoint.getInInterceptors().add(wssIn);
assertEquals(12, calc.multiply(3, 4));
}
@Test
public void testCalculatorViaWsInterfaceWithUsernameTokenPlainPassword() throws Exception {
final Service calcService = Service.create(new URL(base.toExternalForm() + "webservices/CalculatorImplUsernameTokenPlainPassword?wsdl"),
new QName("http://superbiz.org/wsdl", "CalculatorWsService"));
assertNotNull(calcService);
// for debugging (ie. TCPMon)
calcService.addPort(new QName("http://superbiz.org/wsdl",
"CalculatorWsService2"), SOAPBinding.SOAP12HTTP_BINDING,
"http://127.0.0.1:8204/CalculatorImplUsernameTokenPlainPassword");
// CalculatorWs calc = calcService.getPort(
// new QName("http://superbiz.org/wsdl", "CalculatorWsService2"),
// CalculatorWs.class);
final CalculatorWs calc = calcService.getPort(CalculatorWs.class);
final Client client = ClientProxy.getClient(calc);
final Endpoint endpoint = client.getEndpoint();
endpoint.getOutInterceptors().add(new SAAJOutInterceptor());
final Map<String, Object> outProps = new HashMap<String, Object>();
outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
outProps.put(WSHandlerConstants.USER, "jane");
outProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
outProps.put(WSHandlerConstants.PW_CALLBACK_REF, new CallbackHandler() {
@Override
public void handle(final Callback[] callbacks) throws IOException, UnsupportedCallbackException {
final WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
pc.setPassword("waterfall");
}
});
final WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps);
endpoint.getOutInterceptors().add(wssOut);
assertEquals(10, calc.sum(4, 6));
}
@Test
public void testCalculatorViaWsInterfaceWithUsernameTokenHashedPassword() throws Exception {
final Service calcService = Service.create(new URL(base.toExternalForm() + "webservices/CalculatorImplUsernameTokenHashedPassword?wsdl"),
new QName("http://superbiz.org/wsdl", "CalculatorWsService"));
assertNotNull(calcService);
// for debugging (ie. TCPMon)
calcService.addPort(new QName("http://superbiz.org/wsdl",
"CalculatorWsService2"), SOAPBinding.SOAP12HTTP_BINDING,
"http://127.0.0.1:8204/CalculatorImplUsernameTokenHashedPassword");
// CalculatorWs calc = calcService.getPort(
// new QName("http://superbiz.org/wsdl", "CalculatorWsService2"),
// CalculatorWs.class);
final CalculatorWs calc = calcService.getPort(CalculatorWs.class);
final Client client = ClientProxy.getClient(calc);
final Endpoint endpoint = client.getEndpoint();
endpoint.getOutInterceptors().add(new SAAJOutInterceptor());
final Map<String, Object> outProps = new HashMap<String, Object>();
outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
outProps.put(WSHandlerConstants.USER, "jane");
outProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_DIGEST);
outProps.put(WSHandlerConstants.PW_CALLBACK_REF, new CallbackHandler() {
@Override
public void handle(final Callback[] callbacks) throws IOException, UnsupportedCallbackException {
final WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
pc.setPassword("waterfall");
}
});
final WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps);
endpoint.getOutInterceptors().add(wssOut);
assertEquals(10, calc.sum(4, 6));
}
@Test
public void testCalculatorViaWsInterfaceWithUsernameTokenPlainPasswordEncrypt() throws Exception {
final Service calcService = Service.create(new URL(base.toExternalForm() + "webservices/CalculatorImplUsernameTokenPlainPasswordEncrypt?wsdl"),
new QName("http://superbiz.org/wsdl", "CalculatorWsService"));
assertNotNull(calcService);
// for debugging (ie. TCPMon)
calcService.addPort(new QName("http://superbiz.org/wsdl",
"CalculatorWsService2"), SOAPBinding.SOAP12HTTP_BINDING,
"http://127.0.0.1:8204/CalculatorImplUsernameTokenPlainPasswordEncrypt");
// CalculatorWs calc = calcService.getPort(
// new QName("http://superbiz.org/wsdl", "CalculatorWsService2"),
// CalculatorWs.class);
final CalculatorWs calc = calcService.getPort(CalculatorWs.class);
final Client client = ClientProxy.getClient(calc);
final Endpoint endpoint = client.getEndpoint();
endpoint.getOutInterceptors().add(new SAAJOutInterceptor());
final Map<String, Object> outProps = new HashMap<String, Object>();
outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN
+ " " + WSHandlerConstants.ENCRYPT);
outProps.put(WSHandlerConstants.USER, "jane");
outProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
outProps.put(WSHandlerConstants.PW_CALLBACK_REF, new CallbackHandler() {
@Override
public void handle(final Callback[] callbacks) throws IOException, UnsupportedCallbackException {
final WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
pc.setPassword("waterfall");
}
});
outProps.put(WSHandlerConstants.ENC_PROP_FILE, "META-INF/CalculatorImplUsernameTokenPlainPasswordEncrypt-client.properties");
outProps.put(WSHandlerConstants.ENCRYPTION_USER, "serveralias");
final WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps);
endpoint.getOutInterceptors().add(wssOut);
assertEquals(10, calc.sum(4, 6));
}
@Test
public void testCalculatorViaWsInterfaceWithSign() throws Exception {
final Service calcService = Service.create(new URL(base.toExternalForm() + "webservices/CalculatorImplSign?wsdl"),
new QName("http://superbiz.org/wsdl", "CalculatorWsService"));
assertNotNull(calcService);
// for debugging (ie. TCPMon)
calcService.addPort(new QName("http://superbiz.org/wsdl",
"CalculatorWsService2"), SOAPBinding.SOAP12HTTP_BINDING,
"http://127.0.0.1:8204/CalculatorImplSign");
// CalculatorWs calc = calcService.getPort(
// new QName("http://superbiz.org/wsdl", "CalculatorWsService2"),
// CalculatorWs.class);
final CalculatorWs calc = calcService.getPort(CalculatorWs.class);
final Client client = ClientProxy.getClient(calc);
final Endpoint endpoint = client.getEndpoint();
endpoint.getOutInterceptors().add(new SAAJOutInterceptor());
final Map<String, Object> outProps = new HashMap<String, Object>();
outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.SIGNATURE);
outProps.put(WSHandlerConstants.USER, "clientalias");
outProps.put(WSHandlerConstants.PW_CALLBACK_REF, new CallbackHandler() {
@Override
public void handle(final Callback[] callbacks) throws IOException, UnsupportedCallbackException {
final WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
pc.setPassword("clientPassword");
}
});
outProps.put(WSHandlerConstants.SIG_PROP_FILE, "META-INF/CalculatorImplSign-client.properties");
outProps.put(WSHandlerConstants.SIG_KEY_ID, "IssuerSerial");
final WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps);
endpoint.getOutInterceptors().add(wssOut);
assertEquals(24, calc.multiply(4, 6));
}
//END SNIPPET: webservice
}
CustomPasswordHandler
package org.superbiz.calculator;
import org.apache.ws.security.WSPasswordCallback;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;
import java.io.IOException;
public class CustomPasswordHandler implements CallbackHandler {
@Override
public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
if (pc.getUsage() == WSPasswordCallback.USERNAME_TOKEN) {
pc.setPassword("waterfall");
} else if (pc.getUsage() == WSPasswordCallback.DECRYPT) {
pc.setPassword("serverPassword");
} else if (pc.getUsage() == WSPasswordCallback.SIGNATURE) {
pc.setPassword("serverPassword");
}
}
}
arquillian.xml
The test deploys the example to TomEE embedded. src/test/resources/arquillian.xml defines the users the UsernameToken endpoints log in with:
<arquillian
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>
<container qualifier="tomee" default="true">
<configuration>
<property name="httpPort">-1</property>
<property name="stopPort">-1</property>
<property name="appWorkingDir">target/tomee-embedded</property>
<!-- <user>=<password> -->
<property name="users">
jane=waterfall
joe=cool
</property>
<!-- <user>=<role>[,<role>] -->
<property name="roles">
jane=Administrator
joe=Administrator
</property>
</configuration>
</container>
</arquillian>
Running
generate keys:
do.sun.jdk:
[echo] *** Running on a Sun JDK ***
[echo] generate server keys
[java] Certificate stored in file </Users/dblevins/examples/webservice-ws-security/target/classes/META-INF/serverKey.rsa>
[echo] generate client keys
[java] Certificate stored in file </Users/dblevins/examples/webservice-ws-security/target/test-classes/META-INF/clientKey.rsa>
[echo] import client/server public keys in client/server keystores
[java] Certificate was added to keystore
[java] Certificate was added to keystore
do.ibm.jdk:
run:
[echo] Running JDK specific keystore creation target
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running org.superbiz.calculator.CalculatorTest
INFO: Starting Servlet engine: [Apache Tomcat/11.0.25]
INFO: Version: 10.3.0-SNAPSHOT
INFO: ------------------------- localhost -> /webservice-ws-security
INFO: Configuring enterprise application: /path/to/examples/webservice-ws-security/target/tomee-embedded/0/webservice-ws-security
INFO: Auto-deploying ejb CalculatorImplEncrypt2ways: EjbDeployment(deployment-id=CalculatorImplEncrypt2ways)
INFO: Auto-deploying ejb CalculatorImplSign2ways: EjbDeployment(deployment-id=CalculatorImplSign2ways)
INFO: Auto-deploying ejb CalculatorImplEncryptAndSign2ways: EjbDeployment(deployment-id=CalculatorImplEncryptAndSign2ways)
INFO: Created Ejb(deployment-id=CalculatorImplEncrypt2ways, ejb-name=CalculatorImplEncrypt2ways, container=Default Stateless Container)
INFO: Created Ejb(deployment-id=CalculatorImplTimestamp2ways, ejb-name=CalculatorImplTimestamp2ways, container=Default Stateless Container)
INFO: Created Ejb(deployment-id=CalculatorImplTimestamp1way, ejb-name=CalculatorImplTimestamp1way, container=Default Stateless Container)
INFO: Created Ejb(deployment-id=CalculatorImplSign, ejb-name=CalculatorImplSign, container=Default Stateless Container)
INFO: Created Ejb(deployment-id=CalculatorImplSign2ways, ejb-name=CalculatorImplSign2ways, container=Default Stateless Container)
INFO: Created Ejb(deployment-id=CalculatorImplUsernameTokenPlainPassword, ejb-name=CalculatorImplUsernameTokenPlainPassword, container=Default Stateless Container)
INFO: Created Ejb(deployment-id=CalculatorImpl, ejb-name=CalculatorImpl, container=Default Stateless Container)
INFO: Created Ejb(deployment-id=CalculatorImplEncryptAndSign2ways, ejb-name=CalculatorImplEncryptAndSign2ways, container=Default Stateless Container)
INFO: Created Ejb(deployment-id=CalculatorImplUsernameTokenPlainPasswordEncrypt, ejb-name=CalculatorImplUsernameTokenPlainPasswordEncrypt, container=Default Stateless Container)
INFO: Created Ejb(deployment-id=CalculatorImplUsernameTokenHashedPassword, ejb-name=CalculatorImplUsernameTokenHashedPassword, container=Default Stateless Container)
INFO: Started Ejb(deployment-id=CalculatorImplEncrypt2ways, ejb-name=CalculatorImplEncrypt2ways, container=Default Stateless Container)
INFO: Started Ejb(deployment-id=CalculatorImplTimestamp2ways, ejb-name=CalculatorImplTimestamp2ways, container=Default Stateless Container)
INFO: Started Ejb(deployment-id=CalculatorImplTimestamp1way, ejb-name=CalculatorImplTimestamp1way, container=Default Stateless Container)
INFO: Started Ejb(deployment-id=CalculatorImplSign, ejb-name=CalculatorImplSign, container=Default Stateless Container)
INFO: Started Ejb(deployment-id=CalculatorImplSign2ways, ejb-name=CalculatorImplSign2ways, container=Default Stateless Container)
INFO: Started Ejb(deployment-id=CalculatorImplUsernameTokenPlainPassword, ejb-name=CalculatorImplUsernameTokenPlainPassword, container=Default Stateless Container)
INFO: Started Ejb(deployment-id=CalculatorImpl, ejb-name=CalculatorImpl, container=Default Stateless Container)
INFO: Started Ejb(deployment-id=CalculatorImplEncryptAndSign2ways, ejb-name=CalculatorImplEncryptAndSign2ways, container=Default Stateless Container)
INFO: Started Ejb(deployment-id=CalculatorImplUsernameTokenPlainPasswordEncrypt, ejb-name=CalculatorImplUsernameTokenPlainPasswordEncrypt, container=Default Stateless Container)
INFO: Started Ejb(deployment-id=CalculatorImplUsernameTokenHashedPassword, ejb-name=CalculatorImplUsernameTokenHashedPassword, container=Default Stateless Container)
INFO: Webservice(wsdl=http://localhost:53493/webservice-ws-security/webservices/CalculatorImplTimestamp1way, qname={http://superbiz.org/wsdl}CalculatorWsService) --> Ejb(id=CalculatorImplTimestamp1way)
INFO: Webservice(wsdl=http://localhost:53493/webservice-ws-security/webservices/CalculatorImplTimestamp2ways, qname={http://superbiz.org/wsdl}CalculatorWsService) --> Ejb(id=CalculatorImplTimestamp2ways)
INFO: Webservice(wsdl=http://localhost:53493/webservice-ws-security/webservices/CalculatorImplUsernameTokenPlainPassword, qname={http://superbiz.org/wsdl}CalculatorWsService) --> Ejb(id=CalculatorImplUsernameTokenPlainPassword)
INFO: Webservice(wsdl=http://localhost:53493/webservice-ws-security/webservices/CalculatorImplUsernameTokenHashedPassword, qname={http://superbiz.org/wsdl}CalculatorWsService) --> Ejb(id=CalculatorImplUsernameTokenHashedPassword)
INFO: Webservice(wsdl=http://localhost:53493/webservice-ws-security/webservices/CalculatorImplUsernameTokenPlainPasswordEncrypt, qname={http://superbiz.org/wsdl}CalculatorWsService) --> Ejb(id=CalculatorImplUsernameTokenPlainPasswordEncrypt)
INFO: Webservice(wsdl=http://localhost:53493/webservice-ws-security/webservices/CalculatorImplSign, qname={http://superbiz.org/wsdl}CalculatorWsService) --> Ejb(id=CalculatorImplSign)
INFO: Webservice(wsdl=http://localhost:53493/webservice-ws-security/webservices/CalculatorImplEncrypt2ways, qname={http://superbiz.org/wsdl}CalculatorWsService) --> Ejb(id=CalculatorImplEncrypt2ways)
INFO: Webservice(wsdl=http://localhost:53493/webservice-ws-security/webservices/CalculatorImplSign2ways, qname={http://superbiz.org/wsdl}CalculatorWsService) --> Ejb(id=CalculatorImplSign2ways)
INFO: Webservice(wsdl=http://localhost:53493/webservice-ws-security/webservices/CalculatorImplEncryptAndSign2ways, qname={http://superbiz.org/wsdl}CalculatorWsService) --> Ejb(id=CalculatorImplEncryptAndSign2ways)
INFO: Webservice(wsdl=http://localhost:53493/webservice-ws-security/webservices/CalculatorImpl, qname={http://superbiz.org/wsdl}CalculatorWsService) --> Ejb(id=CalculatorImpl)
INFO: Deployed Application(path=/path/to/examples/webservice-ws-security/target/tomee-embedded/0/webservice-ws-security)
INFO: Creating Service {http://superbiz.org/wsdl}CalculatorWsService from WSDL: http://localhost:53493/webservice-ws-security/webservices/CalculatorImplTimestamp1way?wsdl
INFO: Creating Service {http://superbiz.org/wsdl}CalculatorWsService from WSDL: http://localhost:53493/webservice-ws-security/webservices/CalculatorImplTimestamp2ways?wsdl
INFO: Creating Service {http://superbiz.org/wsdl}CalculatorWsService from WSDL: http://localhost:53493/webservice-ws-security/webservices/CalculatorImplUsernameTokenPlainPasswordEncrypt?wsdl
INFO: Creating Service {http://superbiz.org/wsdl}CalculatorWsService from WSDL: http://localhost:53493/webservice-ws-security/webservices/CalculatorImplUsernameTokenHashedPassword?wsdl
INFO: Creating Service {http://superbiz.org/wsdl}CalculatorWsService from WSDL: http://localhost:53493/webservice-ws-security/webservices/CalculatorImpl?wsdl
INFO: Creating Service {http://superbiz.org/wsdl}CalculatorWsService from WSDL: http://localhost:53493/webservice-ws-security/webservices/CalculatorImplSign?wsdl
INFO: Creating Service {http://superbiz.org/wsdl}CalculatorWsService from WSDL: http://localhost:53493/webservice-ws-security/webservices/CalculatorImplUsernameTokenPlainPassword?wsdl
INFO: Undeploying app: /path/to/examples/webservice-ws-security/target/tomee-embedded/0/webservice-ws-security
Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.444 s -- in org.superbiz.calculator.CalculatorTest
Results :
Tests run: 8, Failures: 0, Errors: 0, Skipped: 0