Created
January 24, 2018 21:38
-
-
Save markscottwright/c8c29e6b9b7154313f5e0a4bc7cb5d95 to your computer and use it in GitHub Desktop.
How to supply username and password to a WS-Security 1.0 web service using the JAX-WS RI
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.Set; | |
import javax.xml.namespace.QName; | |
import javax.xml.soap.SOAPEnvelope; | |
import javax.xml.soap.SOAPException; | |
import javax.xml.soap.SOAPHeader; | |
import javax.xml.soap.SOAPHeaderElement; | |
import javax.xml.soap.SOAPMessage; | |
import javax.xml.ws.handler.MessageContext; | |
import javax.xml.ws.handler.soap.SOAPHandler; | |
import javax.xml.ws.handler.soap.SOAPMessageContext; | |
public class UsernamePasswordAdder implements SOAPHandler<SOAPMessageContext> { | |
private static final String NS = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"; | |
private final String password; | |
private final String username; | |
public UsernamePasswordAdder(String username, String password) { | |
this.username = username; | |
this.password = password; | |
} | |
@Override | |
public boolean handleMessage(SOAPMessageContext context) { | |
try { | |
// don't add to responses | |
if (!(Boolean) context | |
.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY)) { | |
return true; | |
} | |
SOAPMessage message = context.getMessage(); | |
SOAPHeader header = message.getSOAPHeader(); | |
SOAPEnvelope envelope = message.getSOAPPart().getEnvelope(); | |
if (header == null) { | |
header = envelope.addHeader(); | |
} | |
SOAPHeaderElement securityHeader = header | |
.addHeaderElement(new QName(NS, "Security")); | |
SOAPHeaderElement userCredentials = header | |
.addHeaderElement(new QName(NS, "UsernameToken")); | |
SOAPHeaderElement usernameHeader = header | |
.addHeaderElement(new QName(NS, "Username")); | |
usernameHeader.addTextNode(username); | |
SOAPHeaderElement passwordHeader = header | |
.addHeaderElement(new QName(NS, "Password")); | |
passwordHeader.addTextNode(password); | |
userCredentials.addChildElement(usernameHeader); | |
userCredentials.addChildElement(passwordHeader); | |
securityHeader.addChildElement(userCredentials); | |
message.saveChanges(); | |
} catch (SOAPException e) { | |
e.printStackTrace(); | |
} | |
return true; | |
} | |
@Override | |
public boolean handleFault(SOAPMessageContext context) { | |
return true; | |
} | |
@Override | |
public void close(MessageContext context) { | |
} | |
@Override | |
public Set<QName> getHeaders() { | |
return null; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Then, add this to your port's binding interface: