XML-RPC身份验证(http与XmlRpcNotAuthorizedException)

时间:2012-01-17 08:22:11

标签: java xml-rpc

我无法找到问题的确切答案(谷歌或此处),所以如果这是我错过的重复,我很抱歉:

我正在编写一个XML-RPC服务器,使用Apache的XML-RPC库(我后悔一点)在Java中需要符合给定的规范。通过身份验证,服务器会生成org.apache.xmlrpc.common.XmlRpcNotAuthorizedException。这不是所需的行为。我想返回HTTP错误401(未经过身份验证)和403(禁止)。但是,Apache继续抛出这些异常,我无法找到解决方法。

例如,在发送正确的用户名/密码后收到的响应:

HTTP/1.1 200 OK
Content-Length:362
Content-Type:text/xml
Server:Jetty(7.x.y-SNAPSHOT)

<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
    ...correct response information here 
</methodResponse>

...错误的用户名和密码:

HTTP/1.1 200 OK
Content-Length:252
Content-Type:text/xml
Server:Jetty(7.x.y-SNAPSHOT)

<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
   ...xmlrpc exception here 
<methodResponse>

我不想要“HTTP / 1.1 200 OK”,我想要“HTTP / 1.1 401 Unauthorized”

我正在考虑继承Apache的ReflectiveXmlRpcHandler(或类似的东西)并尝试拦截异常,但我想知道是否有其他人找到了更好的想法来解决这个问题。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

这似乎很难。如XML-RPC Specification

中所述
Response format

Unless there's a lower-level error, always return 200 OK.

错误验证凭据不是低级错误,它只是一个特定的用例。 但是您可以在客户端启用例外(注意安全问题)来处理这种特殊情况

答案 1 :(得分:1)

我会发布代码,但它触及了太多的地方,当我在这里时,它是一篇文章...

我做了什么:

  • 创建PropagatedHttpException扩展RuntimeException。它只有一个字段,代码,这是HTTP错误代码。
  • 延长XmlRpcServletServer
    • 覆盖writeError以检查错误是否为PropagatedHttpException,如果是, 立刻把它扔掉。
    • 覆盖执行(HttpServletRequestHttpServletResponse)以捕获 PropagatedHttpException并将其作为正确的HTTP错误传递。
  • 延长XmlRpcServlet
    • 设置投放AuthenticationHandler的自定义PropagatedHttpException 特定的HTTP错误代码。
    • 覆盖newXmlRpcServer以返回自定义XmlRpcServletServer.

当我们开始弄清楚它是如何工作的时候我们已经有了一个自定义身份验证处理程序但是在你的情况下可能不需要它并且可以调整writeError代码来检查XmlRpcNotAuthorizedException。实际上我不知道这个例外直到今天才存在......

您现在遇到的问题是,从客户端来看,Apache XML-RPC不会检查它返回的错误代码,然后尝试解析XML响应,而不管结果如何。

Grooveek的答案对我们来说非常令人沮丧,因为我们希望将身份验证挂钩到JRE的内置身份验证中,以便像NTLM这样的东西可以工作,但是如果它要返回HTTP 200那么它就不可能工作没有违反规范。