web-dev-qa-db-fra.com

Authentification JAX-WS et BASIC, lorsque les noms d'utilisateur et les mots de passe sont dans une base de données

Je suis nouveau sur JAX-WS et il y a une chose que je ne comprends pas.

Il existe une tonne de didacticiels sur la configuration de la sécurité JAX-WS, mais dans presque tous les cas, BindingProvider.USERNAME_PROPERTY et BindingProvider.PASSWORD_PROPERTY sont stockés dans un fichier .xml (selon le conteneur, je crois) - ils sont "codés en dur" C'est. Et c'est ce que je ne comprends pas. Comment authentifier un client de service Web en comparant BindingProvider.USERNAME_PROPERTY et BindingProvider.PASSWORD_PROPERTY avec un nom d'utilisateur et un mot de passe qui se trouvent dans une base de données? J'ai essayé de définir BindingProvider.USERNAME_PROPERTY et BindingProvider.PASSWORD_PROPERTY côté client comme ceci:

    ShopingCartService scs = new ShopingCartService(wsdlURL, name);
    ShopingCart sc = scs.getShopingCartPort();
    Map<String, Object> requestContext = ((BindingProvider)sc).getRequestContext();
    requestContext.put(BindingProvider.USERNAME_PROPERTY, userName);
    requestContext.put(BindingProvider.PASSWORD_PROPERTY, password);
    sc.someFunctionCall();

Et puis, côté serveur, récupérer comme ceci:

@Resource
WebServiceContext wsContext;

@WebMethod
public void someFunctionCall() {
    MessageContext mc = wsContext.getMessageContext();
    mc.get(BindingProvider.USERNAME_PROPERTY);
    mc.get(BindingProvider.PASSWORD_PROPERTY);
}

Mais je suis toujours nul, je n'ai rien configuré en XML, le service Web fonctionne très bien, sauf que je ne peux pas obtenir ces variables :(

J'exécute les deux sur Java 1.6, Tomcat 6 et JAX-WS .

Toute aide à l'authentification d'utilisateurs avec des mots de passe à partir d'une base de données est grandement appréciée, merci.

22
ahoge

Je pense que vous recherchez l'authentification JAX-WS au niveau de l'application, pas HTTP de base au niveau du serveur. Voir l'exemple complet suivant:

Authentification d'application avec JAX-WS

Sur le site client du service Web, mettez simplement votre "nom d'utilisateur" et "mot de passe" dans l'en-tête de la demande.

Map<String, Object> req_ctx = ((BindingProvider)port).getRequestContext();
req_ctx.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, WS_URL);

Map<String, List<String>> headers = new HashMap<String, List<String>>();
headers.put("Username", Collections.singletonList("someUser"));
headers.put("Password", Collections.singletonList("somePass"));
req_ctx.put(MessageContext.HTTP_REQUEST_HEADERS, headers);

Sur le site du serveur de service Web, obtenez les paramètres d'en-tête de demande via WebServiceContext.

@Resource
WebServiceContext wsctx;

@WebMethod
public String method() {
    MessageContext mctx = wsctx.getMessageContext();

    Map http_headers = (Map) mctx.get(MessageContext.HTTP_REQUEST_HEADERS);
    List userList = (List) http_headers.get("Username");
    List passList = (List) http_headers.get("Password");
    //...
20
mkyong

BindingProvider.USERNAME_PROPERTY et BindingProvider.PASSWORD_PROPERTY correspondent au mécanisme d'authentification de base HTTP qui active le processus d'authentification au niveau HTTP et non au niveau de l'application ou du servlet.

Fondamentalement, seul le serveur HTTP connaîtra le nom d'utilisateur et le mot de passe (et éventuellement l'application selon les spécifications du serveur HTTP/d'application, comme avec Apache/PHP). Avec Tomcat/Java, ajoutez une configuration de connexion BASIC dans votre web.xml et les rôles de sécurité/contrainte de sécurité appropriés (rôles qui seront ensuite associés à des utilisateurs/groupes d'utilisateurs réels).

<login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>YourRealm</realm-name>
</login-config>

Ensuite, connectez le domaine au niveau du serveur HTTP (ou du serveur d'applications) avec le référentiel d'utilisateurs approprié. Pour Tomcat, vous pouvez consulter JAASRealm, JDBCRealm ou DataSourceRealm qui peuvent répondre à vos besoins.

http://Tomcat.Apache.org/Tomcat-6.0-doc/realm-howto.html

11
snowflake

J'ai eu le même problème et j'ai trouvé la solution ici:

http://www.mastertheboss.com/web-interfaces/336-jax-ws-basic-authentication.html?start=1

bonne chance

6
Muath Badawi

Dans votre client SOAP, vous devez définir la propriété javax.xml.ws.security.auth.username et javax.xml.ws.security.auth.password comme suit:

public class ClientHandler implements SOAPHandler<SOAPMessageContext>{

    public boolean handleMessage(final SOAPMessageContext soapMessageContext)
    {
        final Boolean outInd = (Boolean)soapMessageContext.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
        if (outInd.booleanValue())
        {
          try 
          {
               soapMessageContext.put("javax.xml.ws.security.auth.username", <ClientUserName>);
               soapMessageContext.put("javax.xml.ws.security.auth.password", <ClientPassword>);
          } 
          catch (Exception e)
          {
               e.printStackTrace();
               return false;
          }
         }
      return true;
     }
}
1
MWayush

Pour un exemple utilisant les deux, l'authentification au niveau de l'application et l'authentification de base HTTP, consultez l'un de mes articles précédents .

1
Philipp

J'étais confronté à une situation similaire, je dois fournir à mon WS: nom d'utilisateur, mot de passe et type de mot de passe WSS.

J'utilisais initialement le "Http Basic Auth" (comme @ahoge), j'ai essayé d'utiliser la référence de @ Philipp-Dev. aussi. Je n'ai pas trouvé de solution réussie.

Après une petite recherche approfondie sur google, j'ai trouvé ce post:

https://stackoverflow.com/a/3117841/1223901

Et il y avait ma solution au problème

J'espère que cela peut aider quelqu'un d'autre, comme cela m'aide.

Rgds, iVieL

1
Vielinko