2016-02-29 11 views
0

Я использую политику безопасности usernameToken для обеспечения мыльного веб-сервиса. Я не хочу, чтобы клиент отправлял имя пользователя/пароль для каждого запроса. Можно ли сделать webservice statefull? В настоящее время ServerPasswordCallback вызывается для каждого запроса.webservice SOAP UsernameToken CXF не отправлять имя пользователя и пароль по каждому запросу

Вот мой код:

ComputeWS.java

@WebService(
    serviceName = "ComputeWS", 
    targetNamespace = "http://org.test/compute", 
    name = "ComputeWS") 
@EndpointProperties(
    value = { @EndpointProperty(key = "ws-security.callback-handler", value = "org.test.ServerPasswordCallback") }) 
@Policy(placement = Policy.Placement.BINDING, uri = "WSPolicy.xml") 
public class ComputeWS { 

@WebMethod 
public int add(int x, int y) { 
    return x * y; 
} 

} 

WSPolicy.xml

<?xml version="1.0" encoding="UTF-8" ?> 
<wsp:Policy wsu:Id="WSPolicy" xmlns:wsp="http://www.w3.org/ns/ws-policy" 
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
<wsp:ExactlyOne> 
    <wsp:All> 
     <sp:SupportingTokens xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy"> 
      <wsp:Policy> 
       <sp:UsernameToken sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient"> 
        <wsp:Policy> 
         <sp:WssUsernameToken11/> 
        </wsp:Policy> 
       </sp:UsernameToken> 
      </wsp:Policy> 
     </sp:SupportingTokens> 
    </wsp:All> 
</wsp:ExactlyOne> 
</wsp:Policy> 

ServerPasswordCallback.java

public class ServerPasswordCallback implements CallbackHandler { 

@Override 
public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { 
    WSPasswordCallback pc = (WSPasswordCallback) callbacks[0]; 

    if ("joe".equals(pc.getIdentifier())) { 
     pc.setPassword("joespassword"); 
    } 
} 

} 

ответ

0

Там нет «из коробки «способ сделать т. Вы можете изменить политику «IncludeToken» UsernameToken с «AlwaysToRecipient» на «Once». Затем на стороне сервера вам придется реализовать какой-то способ отслеживания клиента, используя что-то вроде Spring Security или Apache Shiro и т. Д.

+0

Есть ли у вас пример безопасности с IncludeToken до одного раза? Я действительно удивляюсь тому, что не нашел какой-либо образец проекта, используя этот механизм, это обычное требование, когда вы аутентифицируете пользователя, использующего базу данных. –