делаю веб-сервис на jax-ws в netbeans: привожу упрощенный сервис с одним методом: MyTemplateService.java
| Код | package ws;
import javax.jws.WebService; import javax.jws.WebParam;
@WebService(serviceName = "MyTemplateService", portName="MyTemplateServicePort") public class MyTemplateService { public String Start(@WebParam(name = "inParam") String inParam) { return "RESPONSE FROM WEB-SERVICE: " + inParam; } }
|
сейчас заказчик поставил задачу сделать утентификацию при помощи заголовков в soap-сообщении:
<wsse:Security soap:mustUnderstand="1"> <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="UsernameToken-1"> <wsse:Username>USERNAME</wsse:Username> <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">PASSWORD</wsse:Password> <wsse:Nonce>ipFoznGlUEODSYQc9UeTLA==</wsse:Nonce> <wsu:Created>2011-11-01T08:11:01Z</wsu:Created> </wsse:UsernameToken> </wsse:Security>
на клиенте веб-сервиса научился их добавлять при помощи реализации SOAPHandler и HandlerResolver: AuthentificationHeaderHandler.java
| Код | public class AuthentificationHeaderHandler implements SOAPHandler<SOAPMessageContext> { @Override public boolean handleMessage(SOAPMessageContext smc) {
Boolean outboundProperty = (Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); // LOGIN AND PASSWORD ADD TO HEADER if (outboundProperty.booleanValue()) {
//SOAPMessage message = smc.getMessage();
try {
SOAPEnvelope envelope = smc.getMessage().getSOAPPart().getEnvelope(); SOAPHeader header = envelope.addHeader();
SOAPElement authentification = header.addChildElement("Authentification", "wsse"); SOAPElement username = authentification.addChildElement("Username", "wsse"); username.addTextNode("TestUser"); SOAPElement password = authentification.addChildElement("Password", "wsse"); password.addTextNode("TestPassword"); SOAPElement security = header.addChildElement("Security", "wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
SOAPElement usernameToken = security.addChildElement("UsernameToken", "wsse"); usernameToken.addAttribute(new QName("xmlns:wsu"), "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
SOAPElement username = usernameToken.addChildElement("Username", "wsse"); username.addTextNode("TestUser");
SOAPElement password = usernameToken.addChildElement("Password", "wsse"); password.setAttribute("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"); password.addTextNode("TestPassword"); } catch (Exception e) { e.printStackTrace(); } } return outboundProperty;
} }
|
AuthentificationHeaderHandlerResolver.java
| Код | public class AuthentificationHeaderHandlerResolver implements HandlerResolver { public List<Handler> getHandlerChain(PortInfo portInfo) { List<Handler> handlerChain = new ArrayList<Handler>();
AuthentificationHeaderHandler hh = new AuthentificationHeaderHandler();
handlerChain.add(hh);
return handlerChain; } }
|
| Код | .... MyTemplateService_Service service = new MyTemplateService_Service(); AuthentificationHeaderHandlerResolver handlerResolver = new AuthentificationHeaderHandlerResolver(); service.setHandlerResolver(handlerResolver); MyTemplateService port = service.getMyTemplateServicePort(); ....
|
покопал в инете понял что это ws-security, понял что это можно реализовать с помощью Apache WSS4J скачал wss4j, но дальше никак не пойму что делать?
помогите плиз - бьюсь не один день какие конфиги создавать? как и что подключить к веб-сервису, чтобы обрабатывались и проверялись эти заголовки? кстати может кто подскажет - что на клиенте сделать - может можно использовать что то попроще и вообще правильео ли я делаю, что сам добавляю это все в заголовки, а не через какую нибудь библиотеку????
|