Java RMI,JMX与JAAS:如何在下游传播身份验证信息

时间:2018-01-30 20:08:55

标签: java authentication rmi jmx jaas

我有一个RMI服务器,它使用JAAS作为身份验证机制,并公开了几个业务对象(MBean)。 JAAS登录模块包含多个凭证,每个凭证与不同的权限相关联,例如, READ-ONLY,READ-WRITE,DEV等MBean依次依赖这些权限来允许/拒绝某些方法调用。

我花了几天时间进行研究/实验,到目前为止找不到一个机制,允许MBean在调用它们时调用经过身份验证的RMI用户。

首先,我知道有RemoteServer::getClientHost(),但是通过IP识别客户端是不合适的,因为多个进程可能从单个IP连接。

到目前为止,我的发现是:

  1. 建立RMI连接后,用户将通过身份验证并创建新的RMIConnectionImpl实例
  2. RMIConnectionImpl包含身份验证主题/主体以及看似唯一的连接ID
  3. 在进行远程调用时,RMIConnectionImpl的任何识别信息都不可用/可检索
  4. 由于似乎无法确定调用来自哪个RMIConnectionImpl我最初尝试使用尝试JAAS身份验证的线程作为标识符。这个计划没有用,因为自然地,RMI使用线程池,并且后续的远程方法调用不能保证由同一个线程执行。

    我想到的另一个想法是使用AspectJ LTW拦截RMIConnectionImpl::invoke(..)并通过某个全局ThreadLocal将用户与线程相关联。但是有一个痛苦的世界可以让它全部发挥作用,而且它确实感觉像是一个巨大的矫枉过正。

    当然,对于这个真正常见的用例,必须有一个更简单的解决方案。因此,我很困惑,担心我可能会错过这里的大事。

    非常感谢任何帮助/建议。

0 个答案:

没有答案