假设我的服务器导出以下过程:
List listFiles(int userId);
我不能让任何用户列出给定用户的文件。他们需要获得授权才能这样做。
我的XML-RPC服务使用基本身份验证来验证用户身份。
使过程调用可以访问登录凭据(当前用户对象)的推荐方法是什么?
答案 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。
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公开的对象将能够引用经过身份验证的用户并相应地授权方法。