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 中的测试脚本隐藏登录凭据
如何提交 Google 登录身份验证的 PlayStore 应用访问凭据?
XML-RPC(remote procedure call 远程过程调用远端程序呼叫)(一种通过XML将调用函数封装,并使用HTTP协议作为传送机制的分布式计算协议)