java - jax - Usuario autenticado en SOAP-¿Cómo?
ws-security ejemplo (1)
JAAS no define cómo debería ser la información de autenticación en SOAP, pero WS-Security define qué tipo de tokens estandarizados puede usar durante el intercambio cliente-servidor (nombre de usuario + token de contraseña / certificado X.509 / token SAML / token Kerberos ).
EDITAR: Con respecto a la pila Metro WebService, necesita (pasos tomados aquí y aquí ):
- Inyecte el controlador, que implementa
javax.xml.ws.handler.soap.SOAPHandler
a la cadena de controladores JAX-WS, ya sea programáticamente a través de((BindingProvider)port).getBinding().setHandlerChain(Collections.singletonList(handler))
o de forma declarativa agregando@HandlerChain(file = "handlers.xml")
anotación a su interfaz de punto final WS. - El controlador debe crear la instancia
XWSSProcessor
utilizandoXWSSProcessorFactory
, que se pasa el controlador de devolución de llamada que implementajavax.security.auth.callback.CallbackHandler
. - El controlador de devolución de llamada, por ejemplo, define un validador en la devolución de llamada (depende del tipo de devolución de llamada).
Esto es lo mismo que "hacer a mano" (ya que el primer paso es interceptar el mensaje SOAP de todos modos), con algo de azúcar WSS en la parte superior. Pero WSIT (y CXF) usan JAAS API y proporcionan implementaciones estándar para varios tokens de autenticación. Permitirles necesita algunos esfuerzos de configuración / codificación, pero la ventaja es que si luego decides cambiar de plainttext a la autenticación Kerberos, no necesitas codificar mucho. Además, "hacerlo a mano" significa que debe tratar la información de autenticación a nivel XML y lo que hará es implementar uno de los estándares.
Sugiero usar Apache CXF que se base en WSS4J : la implementación de WS-Security de Apache. Puede encontrar fácilmente tutoriales (por ejemplo, aquí y aquí para nombre de usuario + contraseña, aquí y aquí para SAML) que se muestran para definir la devolución de llamada / interceptores para verificar la información de autenticación. La ventaja de CXF es que tiene una buena integración con Spring.
Hice una pregunta sobre JAX-WS, Autenticación y Autorización - ¿Cómo? ; hubo una discusión sobre los niveles de seguridad y dónde almacenar las credenciales de los usuarios.
Ahora, después de algunas conclusiones, quiero probar uno de esos escenarios:
- Servicios web SOAP - metro
- Nivel de mensajes de seguridad: autenticación de certificados mutuos para autenticar la aplicación cliente
- Credencial de usuario en el encabezado de Soap
¿Cómo obtener las credenciales y hacer la autorización? Tengo 2 ideas:
- JAAS (no sé nada de esto);
- Controlador SOAP: utiliza WebServiceContext para extraer las credenciales del mensaje y realizar la autorización "a mano".
¿Puede ayudarme a decidir de la mejor manera y cómo implementarlo?
Recuerde que quiero un certificado mutuo, más un token de usuario.