我有一个RMI服务器,它使用JAAS作为身份验证机制,并公开了几个业务对象(MBean)。 JAAS登录模块包含多个凭证,每个凭证与不同的权限相关联,例如, READ-ONLY,READ-WRITE,DEV等MBean依次依赖这些权限来允许/拒绝某些方法调用。
我花了几天时间进行研究/实验,到目前为止找不到一个机制,允许MBean在调用它们时调用经过身份验证的RMI用户。
首先,我知道有RemoteServer::getClientHost()
,但是通过IP识别客户端是不合适的,因为多个进程可能从单个IP连接。
到目前为止,我的发现是:
RMIConnectionImpl
实例RMIConnectionImpl
包含身份验证主题/主体以及看似唯一的连接ID RMIConnectionImpl
的任何识别信息都不可用/可检索由于似乎无法确定调用来自哪个RMIConnectionImpl
我最初尝试使用尝试JAAS身份验证的线程作为标识符。这个计划没有用,因为自然地,RMI使用线程池,并且后续的远程方法调用不能保证由同一个线程执行。
我想到的另一个想法是使用AspectJ LTW拦截RMIConnectionImpl::invoke(..)
并通过某个全局ThreadLocal
将用户与线程相关联。但是有一个痛苦的世界可以让它全部发挥作用,而且它确实感觉像是一个巨大的矫枉过正。
当然,对于这个真正常见的用例,必须有一个更简单的解决方案。因此,我很困惑,担心我可能会错过这里的大事。
非常感谢任何帮助/建议。