【问题标题】:XML-RPC authentication (http vs. XmlRpcNotAuthorizedException)XML-RPC 身份验证(http 与 XmlRpcNotAuthorizedException)
【发布时间】:2012-01-17 08:22:11
【问题描述】:

我找不到我的问题的确切答案(谷歌或这里),所以如果这是我错过的重复,我深表歉意:

我正在使用 Apache 的 XML-RPC 库(我有点遗憾)在 Java 中编写一个 XML-RPC 服务器,它需要符合给定的规范。通过身份验证,服务器会生成 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(或类似的东西)并尝试拦截异常,但我想知道是否有人找到了解决这个问题的更好方法。

有什么想法吗?

【问题讨论】:

    标签: java xml-rpc


    【解决方案1】:

    这似乎很难。如XML-RPC Specification中所述

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

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

    【讨论】:

    • 谢谢...在过去的几天里,我得出了同样的结论。您如何看待在 HTTP 服务器(在我的例子中是 Jetty)上处理这个问题?在将身份验证传递给 XML-RPC 库之前,您会在那里处理身份验证吗?即快速失败?
    • 你们提供什么认证之王?基本通过 HTTP ?
    • 是的,基本的 HTTP 身份验证。
    • Grooveek? ...任何厘米?赏金即将到期,如果您能提供一些见解,我想奖励它。
    • 我花了一些时间跳到库的源代码中,但看不到任何方法或类可以挂钩,因为几乎所有方法或类都会抛出 XMLRpcException。如果您不使用默认的网络服务器,解决方案将是实现一个 BasicHttpAuthenticationFilter ,它仅在身份验证成功时才委派请求处理。然后您可以返回 401/403。抱歉,我真的无法为您提供更多帮助。
    【解决方案2】:

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

    我做了什么:

    • 创建 PropagatedHttpException 扩展 RuntimeException。它只有一个字段,code,即 HTTP 错误代码。
    • 扩展XmlRpcServletServer:
      • 重写 writeError 以检查错误是否为PropagatedHttpException,如果是, 立即扔掉。
      • 覆盖执行(HttpServletRequest, HttpServletResponse) 来捕获 PropagatedHttpException 并将其作为正确的 HTTP 错误传递。
    • 扩展XmlRpcServlet:
      • 设置一个自定义AuthenticationHandler,它会抛出PropagatedHttpException 特定的 HTTP 错误代码。
      • 覆盖newXmlRpcServer 以返回自定义XmlRpcServletServer.

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

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

    Grooveek 的回答让我们非常沮丧,因为我们希望将身份验证与 JRE 的内置身份验证挂钩,这样 NTLM 之类的东西就可以工作,但如果它要返回 HTTP 200,那么它就不可能工作在不违反规范的情况下。

    【讨论】:

    • 我所做的基本上是放弃 Apache 中发生的所有身份验证。我使用 Jetty 作为网络服务器,并在调用进入 XML-RPC 部分之前拦截了它。这作为一种魅力,实际上也导致了更快的响应(参见接受的答案)。也感谢您分享您的经验! (+1)
    • 是的,但在我们的例子中,不同的 XML-RPC 对象具有不同的访问级别。所以不幸的是,我们暂时死在了水里……
    • @Trejkaz 凭据不是主要用于 ID,然后应用程序确定授权吗?授权应该在带外(本地存储或远程),而不是在数据事务通道中。
    • @Dennis 应用程序正在确定授权。问题在于,当拒绝访问发生时,HTTP 响应代码会误导性地暗示请求成功。
    猜你喜欢
    • 2014-06-20
    • 2011-06-24
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多