2009-10-23 12 views
19

Soy nuevo en JAX-WS y hay algo que no entiendo.JAX-WS y autenticación BASIC, cuando los nombres de usuario y las contraseñas están en una base de datos

Hay una tonelada de tutoriales disponibles sobre cómo configurar la seguridad JAX-WS, pero en casi todos los casos BindingProvider.USERNAME_PROPERTY y BindingProvider.PASSWORD_PROPERTY se almacenan en algún archivo .xml (dependiendo del contenedor en el que creo): están "codificados" eso es. Y eso es lo que no entiendo ¿Cómo puedo autenticar un cliente del servicio web comparando BindingProvider.USERNAME_PROPERTY y BindingProvider.PASSWORD_PROPERTY con un nombre de usuario y una contraseña que están en una base de datos? He intentado establecer BindingProvider.USERNAME_PROPERTY y BindingProvider.PASSWORD_PROPERTY en el lado del cliente como esto:

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(); 

Y luego, en el lado del servidor de la recuperación de la siguiente manera:

@Resource 
WebServiceContext wsContext; 

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

Pero siempre consigo nula, yo no 't instalar nada en XML, servicios web funciona bien, excepto que no puedo conseguir esas variables :(

estoy ejecutan tanto en java 1.6, Tomcat 6 y JAX-WS.

Cualquier ayuda con la autenticación de usuarios con contraseñas desde una base de datos es muy apreciada, Gracias.

+0

También he probado la comprobación de BindingProvider.USERNAME_PROPERTY en un SOAPHandler, siendo nula. – ahoge

Respuesta

12

BindingProvider.USERNAME_PROPERTY y BindingProvider.PASSWORD_PROPERTY se corresponden con el mecanismo de autenticación básica HTTP que habilita el proceso de autenticación en el nivel HTTP y no en el nivel de la aplicación ni del servlet.

Básicamente, solo el servidor HTTP conocerá el nombre de usuario y la contraseña (y eventualmente la aplicación de acuerdo con la especificación del servidor HTTP/aplicación, como Apache/PHP). Con Tomcat/Java, agregue un BASIC de configuración de inicio de sesión en su web.xml y los roles de seguridad-restricción/seguridad apropiados (roles que luego se asociarán a usuarios/grupos de usuarios reales).

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

A continuación, conecte el dominio en el nivel del servidor HTTP (o servidor de aplicaciones) con el repositorio de usuarios apropiado. Para Tomcat, puede consultar JAASRealm, JDBCRealm o DataSourceRealm que se ajusten a sus necesidades.

http://tomcat.apache.org/tomcat-6.0-doc/realm-howto.html

19

creo que busca la autenticación de JAX-WS en el nivel de aplicación, no HTTP básica en el nivel de servidor. Véase el siguiente ejemplo completo:

Application Authentication with JAX-WS

En el sitio de cliente de servicios web, sólo hay que poner el “nombre de usuario” y “contraseña” en encabezado de la solicitud.

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

En el sitio del servidor de servicios web, obtener los parámetros de la petición de cabecera a través de 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"); 
    //... 
+0

¿Puedo preguntar de dónde obtuvo esa información? Necesito la fuente oficial de información pero no pude encontrar ninguna fuente oficial con suficiente información. –

+3

El ejemplo dado aquí está muy mal diseñado y es muy inseguro. Nunca debe cocinar en casa una solución de seguridad. El ejemplo también transfiere nombres de usuario y contraseñas a través de http inseguro. Si alguien está escuchando la red, es fácil retomarla. También es muy fácil configurar la autenticación básica (ver la respuesta de snowflake), y usar eso sobre https. Esa es al menos una solución decente que no requiere programación propensa a errores, y las contraseñas son seguras en redes desprotegidas. –

1

Para un ejemplo usando tanto, la autenticación de nivel de aplicación y la autenticación básica HTTP ver uno de mi previous posts.

1

Estaba frente a frente en una situación similar, tengo que proporcionar a mi WS: nombre de usuario, contraseña y tipo de contraseña de WSS.

Al principio estaba usando "Http Basic Auth" (como @ahoge), traté de usar la referencia de @ Philipp-Dev. también. No obtuve una solución de éxito.

Después de un poco de búsqueda de profundidad en Google, encontré este post:

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

Y no fue mi solución del problema

Espero que esto puede ayudar a cualquier otra persona, como ayuda para mí.

Rgds, iVieL

Cuestiones relacionadas