XML-RPC: как сделать учетные данные для входа доступными для вызовов процедур? - PullRequest
0 голосов
/ 18 января 2012

Скажем, мой сервер экспортирует следующую процедуру:

List listFiles(int userId);

Я не могу позволить любому пользователю перечислять файлы для данного пользователя. Они должны иметь разрешение для этого.

Мой сервис XML-RPC использует базовую аутентификацию для аутентификации пользователей.

Каков рекомендуемый способ сделать учетные данные для входа в систему (объект текущего пользователя) доступными для вызовов процедур?

Ответы [ 2 ]

0 голосов
/ 27 января 2012

Я нашел решение.Ключ заключается в том, чтобы создать подкласс 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 сможет ссылаться на аутентифицированного пользователя и соответствующим образом авторизовать методы.

0 голосов
/ 25 января 2012

Если вы напишите свой собственный подкласс XmlRpcServlet (см., Например, http://ws.apache.org/xmlrpc/server.html раздел «Базовая аутентификация»), вы можете прикрепить учетные данные пользователя в ThreadLocal (см. http://java.dzone.com/articles/java-thread-local-%E2%80%93-how-use).

...