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

时间:2012-01-18 15:29:15

标签: java xml-rpc rpc

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

List listFiles(int userId);

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

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我发现了解决方案。关键是将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作为folows:

   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公开的对象将能够引用经过身份验证的用户并相应地授权方法。