2012-01-18 6 views
0

は、私のサーバーは、次の手順をエクスポート言う:XML-RPC:プロシージャー呼び出しでログイン認証情報にアクセスする方法

List listFiles(int userId); 

私は与えられたユーザ用のファイルをリストするだけで、任意のユーザーを許可することはできません。彼らはそうするための許可を必要とします。

私のXML-RPCサービスは、基本認証を使用してユーザーを認証します。

ログイン資格情報(現在のユーザオブジェクト)をプロシージャコールにアクセスさせるには、どのような方法が推奨されますか?

+0

どのXML-RPCサーバーの実装を使用していますか? –

+0

Apache XML-RPC - > http://ws.apache.org/xmlrpc/ – Alexandre

答えて

0

解決策を発見しました。キーは、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; 
     } 
    } 

パラメータ:: - requestオブジェクト 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(); 
    } 
    } 

だから私の元の質問に答えるために、私はfolowsとして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オブジェクトは、認証されたユーザーを参照し、それに応じてメソッドを承認することができます。

関連する問題