如何手动设置/传播安全上下文信息,例如JBoss 7的负责人(通过JBoss远程处理2)

时间:2012-05-17 04:17:10

标签: authentication jboss ejb-3.1

我正在使用jboss远程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的信息(我没有使用),但似乎没有任何东西符合我的特定背景。

3 个答案:

答案 0 :(得分:1)

现在,正确的方法是这样做:

在客户端,我获取安全上下文并打包安全域和主题信息以便与调用一起传输到服务器。 SecurityDomain是一个String,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);
}

像魅力一样!

答案 1 :(得分:0)

查看jboss-ejb-client.properties。还有一个quickstart示例使用远程客户端来查找EJB。

答案 2 :(得分:0)

我已经解决了我的根本问题,虽然不是我希望的一般方式。

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

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