在此链接中,缺少关于使 2 个容器相互信任的信息,引用自“容器之间的信任”:
当企业 bean 被设计为使用原始调用者身份或指定身份来调用目标 bean 时,目标 bean 将仅接收传播的身份。目标 bean 将不会收到任何身份验证数据。
目标容器无法验证传播的安全身份。但是,由于安全身份用于授权检查(例如,方法权限或与 isCallerInRole 方法一起使用),因此 >security 身份的真实性至关重要。因为没有可用的身份验证数据来验证传播的身份,所以目标必须相信调用容器已经传播了经过身份验证的安全身份。
默认情况下,GlassFish Server 配置为信任从不同容器传播的身份。因此,您无需采取任何特殊步骤来建立信任关系。
最后一部分吓到我了。但无论如何,我想知道如何让 2 个容器相互信任而不是相互信任,以及这在 Tomcat 5.5 和 Glassfish 3.1.2 之间是否可行(因为我需要从 1 个容器到另一个容器使用 @RunAs) .
为了进一步澄清我的问题,我将告诉您我必须做什么以及我的解决方案:
我正在制作一个 Restful webservice 以允许客户端下载文件,此 webservice 位于 *CONTAINER_A*,但在下载文件之前,webservices 调用 *CONTAINER_B* 中的 EJB 以获取文件的路径一个数据库,也在 *CONTAINER_B* 中。问题是,我想确保从 *CONTAINER_B* 对 EJB 的调用只能由 CONTAINER_A 中的 Web 服务访问,并且我在 Web 服务中使用 @RunAs 注释,因此它充当 *AUTHORIZED_ROLE*。问题是,访问 Web 服务的客户端,我们称之为 *WEB_CLIENT*,不必经过身份验证即可访问 Web 服务,但 *CONTAINER_B* 中的 EJB 是安全的,只能由 *AUTHORIZED_ROLE* 访问。
清楚吗?还是我把事情复杂化了?有更好的方法吗?因为 @RunAs 解决方案仅在我将 JAX-RS webservice 也设为 @Stateless bean 时才可用,并且不鼓励使用文件系统操作(例如读取文件并将其发回),但目前是我唯一可以使用的解决方案考虑到。