2016-02-29 2 views
0

J'utilise la politique de sécurité usernameToken pour sécuriser un webservice de savon. Je ne veux pas que le client envoie le nom d'utilisateur/mot de passe sur chaque demande. Est-il possible de rendre le webservice statefull? ServerPasswordCallback est actuellement appelé pour chaque requête.webservice SOAP Nom d'utilisateurToken CXF n'envoie pas de nom d'utilisateur/mot de passe pour chaque requête

Voici mon code:

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"); 
    } 
} 

} 

Répondre

0

Il n'y a pas « de la boîte "façon de faire je t. Vous pouvez modifier la politique "IncludeToken" du nom d'utilisateurToken de "AlwaysToRecipient" à "Once". Ensuite, du côté serveur, vous devrez implémenter un moyen de garder une trace du client, via quelque chose comme Spring Security ou Apache Shiro, etc.

+0

Avez-vous un exemple de SecurityPolicy avec IncludeToken to Once? Je suis vraiment surpris de ne pas trouver un exemple de projet utilisant ce mécanisme, ceci est une exigence courante lorsque vous authentifiez un utilisateur en utilisant une base de données. –