3

我正在使用 jboss remoting 2.5.4.SP3 提供从 Web 应用程序和其他 JBoss 实例对 JBoss 7.1 服务器中的 EJB 的远程访问。由于 JBoss 7.1 中的远程 EJB 访问问题,我手动执行此操作,特别是(但不仅)无法同时访问多个服务器上的相同(接口)bean。我正在使用 remoting2 因为 remoting3 没有文档。

我使用套接字传输使用 TransporterHandle/TransporterClient 进行远程处理,但是在通过此远程连接调用的方法中,服务器希望从 ejbContext 中查找主体。我找不到手动设置主体或其他上下文安全/身份信息的方法。在极限情况下,我很乐意在调用 ejb 方法时设置主体——所有传入调用都是对本地 EJB3 bean 的——或者甚至专门为 EJBContext 设置它。

我找到了很多关于 Spring 的信息(我没有使用),但似乎没有什么与我的特定上下文相匹配。

4

3 回答 3

1

现在,正确的方法是:

在客户端,我获取安全上下文并打包安全域和主题信息,以便与调用一起传输到服务器。SecurityDomain 是一个字符串,SubjectInfo 是可序列化的:

Map m = new HashMap();
SecurityContext securityContext = SecurityContextAssociation.getSecurityContext();
if (securityContext != null) {
    m.put("SUBJECT-INFO", securityContext.getSubjectInfo());
    m.put("SECURITY-DOMAIN", securityContext.getSecurityDomain());
}
response = remotingClient.invoke(request, m);

地图 m 通过 jboss 远程处理的调用发送。在服务器端,我提取安全信息并为调用设置上下文,如下所示:

SecurityContext oldContext = SecurityContextAssociation.getSecurityContext();
SubjectInfo si = (SubjectInfo) invocation.getRequestPayload().get("SUBJECT-INFO");
String domain = (String) invocation.getRequestPayload().get("SECURITY-DOMAIN");
if (si != null) {
    SecurityContext sc = new JBossSecurityContext(domain);
    sc.setSubjectInfo(si);
    SecurityContextAssociation.setSecurityContext(sc);
}
try {
    return super.invoke(invocation);
} finally {
    SecurityContextAssociation.setSecurityContext(oldContext);
}

奇迹般有效!

于 2012-05-19T01:24:52.030 回答
0

看看jboss-ejb-client.properties。还有一个使用远程客户端查找 EJB的快速入门示例。

于 2012-05-17T21:48:26.057 回答
0

我已经解决了我的潜在问题,尽管不是以我希望的一般方式。

我在所有传入请求上放置了一个 servlet 过滤器,将 request.getUserPrincipal 记录在本地线程中。然后我可以在非 EE 代码中访问它并找到发出请求的委托人。然后,当我调用我的应用服务器时,我使用 JBoss Remoting 将元数据附加到每个调用以通过网络传递 Principal 的能力。我必须复制 TransporterClient 来执行此操作,因为它是私有构造函数等不允许覆盖附加每个请求元数据(而不是每个连接)所需的功能。在服务器端,我获取传入的 Principal 并将其设置为本地线程。然后,在访问 EJBContext.getCallerPrincipal 的后续代码中,我还从本地线程查找传入的 Principal,如果它不为空(因此我们处于远程 EJB 调用中),如果调用者主体是匿名的,我会使用它。如果它不是匿名的,那么它一定是在来电之后以某种方式设置的,所以在这种情况下我会忽略传入的 Principal。

总而言之,这是一个比我希望的更专业的解决方案,它并没有说明如何在 JBoss 7.1 中通过网络进行通用上下文传播。

于 2012-05-18T00:28:49.123 回答