java rmi身份validation和安全性。 exportObject使它公开?

问题:

当您使用UnicastRemoteObject.exportObject(instance) 。 该实例现在是否可供所有客户公开使用。 即使找到它的端口需要一点点棘手。

情况就是这样:

我有一个java RMI客户端/服务器设置,我想添加一些身份validation。 允许客户端在任何其他RPC调用工作之前使用用户/传递组合。

我在网上找到了一个简单的建议,起初看起来不错。

 interface LoginService implements Remote { public MainService login(String username, char[] password) throws RemoteException; } interface MainService implements Remote { /* all my real rpc calls go here */ } 

我们的想法是,创建一个远程对象来体现对RPC的经过身份validation的访问。 并通过执行身份validation的第一层访问它。

LoginServiceImpl.login()必须看起来像那样。

 public MainService login(String username, char[] password) throws RemoteException { /* verify username and password */ MainService service = new MainServiceImpl(); MainService stub = UnicastRemoteObject.exportObject(service, 0); return stub; } 

因此,每个调用login()客户端都会获得自己专用的MainService远程实例。 当然,我将整个东西包装在ssl中以保护纯文本密码。

这就是问题:

似乎在我导出新的MainServiceImpl实例后,它现在公开可用。 知道要查找的内容的任何其他客户端都可以连接到它并在该MainServiceImpl实例上进行调用。

我必须在创建后导出MainService,否则RMI不会将存根发送到客户端。 相反,它将尝试序列化MainService实例。

我可以在MainService粘贴用户名,但这实际上没有帮助。

在切换到JRMP(RMI线路协议)之前,您需要进行身份validation。 有一个JSR,但它被拒绝了。 JERI为JINI做了。

使用客户端身份validation的SSL可以解决此问题