XML-RPC:如何使过程调用可以访问登录凭据?

Posted

技术标签:

【中文标题】XML-RPC:如何使过程调用可以访问登录凭据?【英文标题】:XML-RPC: how to make login credentials accessible to procedure calls? 【发布时间】:2012-01-18 15:29:15 【问题描述】:

假设我的服务器导出以下程序:

List listFiles(int userId);

我不能只允许任何用户列出给定用户的文件。他们需要获得授权才能这样做。

我的 XML-RPC 服务使用基本身份验证对用户进行身份验证。

让过程调用可以访问登录凭据(当前用户对象)的推荐方法是什么?

【问题讨论】:

你使用的是什么 XML-RPC 服务器实现? Apache XML-RPC -> ws.apache.org/xmlrpc 【参考方案1】:

如果您编写自己的 XmlRpcServlet 子类(有关示例,请参阅 http://ws.apache.org/xmlrpc/server.html 基本身份验证部分),您可以将用户凭据粘贴在 ThreadLocal 上(请参阅 http://java.dzone.com/articles/java-thread-local-%E2%80%93-how-use)。

【讨论】:

【参考方案2】:

我发现了解决方案。关键是对 RequestProcessorFactoryFactory 进行子类化,并指定您希望使用子类的 Handler。

http://ws.apache.org/xmlrpc/apidocs/org/apache/xmlrpc/server/RequestProcessorFactoryFactory.RequestSpecificProcessorFactoryFactory.html

protected java.lang.Object getRequestProcessor(java.lang.Class pClass,
                                               XmlRpcRequest pRequest)
                                        throws XmlRpcException

子类可能会覆盖此方法以进行特定于请求的配置。典型的子类如下所示:

   public class MyRequestProcessorFactoryFactory
           extends RequestProcessorFactoryFactory.RequestSpecificProcessorFactoryFactory 
       protected Object getRequestProcessor(Class pClass, XmlRpcRequest pRequest) 
           Object result = super.getRequestProcessor(pClass, pRequest);
           // Configure the object here
           ...
           return result;
       
   

参数: pRequest - 请求对象。 抛出: XmlRpcException

这是一个告诉默认处理程序使用您的工厂的示例:

  public class EchoServer 
    public static void main(String[] args) throws Exception 
      WebServer webServer = new WebServer(8080);
      XmlRpcServer xmlRpcServer = webServer.getXmlRpcServer();
      PropertyHandlerMapping phm = new PropertyHandlerMapping();
      EchoService echo = new EchoServiceImpl();
      phm.setRequestProcessorFactoryFactory(new MyRequestProcessorFactoryFactory());
      phm.setVoidMethodEnabled(true);
      phm.addHandler(EchoService.class.getName(), EchoService.class);
      xmlRpcServer.setHandlerMapping(phm);

      XmlRpcServerConfigImpl serverConfig = (XmlRpcServerConfigImpl) xmlRpcServer.getConfig();
      serverConfig.setEnabledForExtensions(true);
      serverConfig.setContentLengthOptional(false);
      webServer.start();
    
  

所以为了回答我最初的问题,我将创建一个 RequestProcessorFactoryFactory,如下所示:

   public class MyRequestProcessorFactoryFactory
           extends RequestProcessorFactoryFactory.RequestSpecificProcessorFactoryFactory 
       protected Object getRequestProcessor(Class pClass, XmlRpcRequest pRequest) 
           Object result = super.getRequestProcessor(pClass, pRequest);
           // Configure the object here
           ClassOfObjectBeingExposedViaXmlRpc obj = (ClassOfObjectBeingExposedViaXmlRpc) result;
           XmlRpcHttpRequestConfig httpRequest = (XmlRpcHttpRequestConfig) pRequest.getConfig();
           MyUserClass user = authenticateSomehow(httpRequest.getBasicUserName(), httpRequest.getBasicPassword());
           obj.setUser(user);
           return result;
       
   

因此,XML-RPC 公开对象将能够引用经过身份验证的用户并相应地授权方法。

【讨论】:

以上是关于XML-RPC:如何使过程调用可以访问登录凭据?的主要内容,如果未能解决你的问题,请参考以下文章

当他使用相同的凭据登录两次时如何使用户会话无效

有没有办法从 python 3.x 中的测试脚本隐藏登录凭据

以 text/html 内容类型发送登录凭据

XML-RPC远程方法调用

如何提交 Google 登录身份验证的 PlayStore 应用访问凭据?

XML-RPC(remote procedure call 远程过程调用远端程序呼叫)(一种通过XML将调用函数封装,并使用HTTP协议作为传送机制的分布式计算协议)