SOAP Web服务中的用户身份验证

时间:2011-10-14 11:16:23

标签: java soap jax-ws ws-security

我提出了一个关于JAX-WS, Authentication and Authorization - How to?的问题;讨论了安全级别以及存储用户凭据的位置。

现在经过一些结论后,我想尝试其中一种方案:

  • SOAP Web服务 - metro
  • 消息级别安全性 - 用于对客户端应用程序进行身份验证的相互证书身份验证
  • Soap Header中的用户凭据

如何获取凭据并执行授权? 我有两个想法:

  • JAAS(我对此一无所知);
  • SOAP处理程序 - 使用WebServiceContext从邮件中提取凭据并“手动”执行授权。

您能帮助我决定最佳方式,以及如何实施它?

请记住,我需要共同证书以及用户令牌。

1 个答案:

答案 0 :(得分:7)

JAAS未定义身份验证信息在SOAP中的外观,但WS-Security定义了在客户端 - 服务器交换期间可以使用的标准化令牌类型(用户名+密码令牌/ X.509)证书/ SAML令牌/ Kerberos令牌)。

编辑:关于Metro WebService堆栈,您需要(从herehere采取的步骤):

  • 通过javax.xml.ws.handler.soap.SOAPHandler以编程方式向JAX-WS处理程序链注入实现((BindingProvider)port).getBinding().setHandlerChain(Collections.singletonList(handler))的处理程序,或者通过向WS端点接口添加@HandlerChain(file = "handlers.xml")注释以声明方式注入。
  • 处理程序应使用XWSSProcessor创建XWSSProcessorFactory实例,该实例将传递实现javax.security.auth.callback.CallbackHandler的回调处理程序。
  • 回调处理程序,例如在回调上定义验证器(取决于回调类型)。

这与“手工操作”相同(因为第一步是交叉SOAP消息),顶部有一些WSS糖。但WSIT(和CXF)使用JAAS API,它们为各种身份验证令牌提供标准实现。启用它们需要一些配置/编码工作,但好处是如果您以后决定从plainttext切换到Kerberos身份验证,则不需要编写很多代码。此外,“手动执行”意味着您需要处理XML级别的身份验证信息,以及您将要执行的标准之一。

我建议使用基于Apache CXFWSS4J - 来自Apache的WS-Security实现。您可以轻松找到教程(例如herehere用于用户名+密码,herehere用于SAML),以显示定义callback /拦截器以进行验证验证信息。 CXF的优势在于它与Spring的良好集成。