有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

List listFiles(int userId);

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

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

建议采用什么方法使过程调用可以访问登录凭据(当前用户对象)


共 (2) 个答案

  1. # 1 楼答案

    我找到了解决办法。关键是对RequestProcessorFactoryFactory进行子类化,并向处理程序指定要使用的子类

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