如何从纯客户端调用远程EJB(基于IIOP的RMI)时传播JAAS主题

Yve*_*tin 9 java websphere jboss jaas java-ee

我正在使用从原始Java运行时上运行的独立EJB客户端到JavaEE服务器的自定义Principal测试JAAS Subject的传播.我的目标是JBoss和WebSphere实现.

根据这个论坛帖子,我预计它可以轻松地与JBoss一起使用.

这是我的EJB客户端代码代码段:

Subject subject = new Subject();
Principal myPrincipal = new MyPrincipal("me I myself");
subject.getPrincipals().add(myPrincipal);

PrivilegedExceptionAction<String> action = new PrivilegedExceptionAction<String>() {
    public String run() throws Exception {
            String result;
            System.out.println("Current Subject: " + Subject.getSubject(AccessController.getContext()));
            InitialContext ic = new InitialContext();
            Business1 b = (Business1) ic.lookup("StatelessBusiness1");
            result = b.getNewMessage("Hello World");
            return result;
        }
    };

result = subject.doAs(subject, action);
System.out.println("result "+result);
Run Code Online (Sandbox Code Playgroud)

服务器端代码是:

public String getNewMessage(String msg) {
    System.out.println("getNewMessage principal: " + sessionContext.getCallerPrincipal());
    System.out.println("Current Subject: " + Subject.getSubject(AccessController.getContext()));
    return "getNewMessage: " + msg;
}
Run Code Online (Sandbox Code Playgroud)

可以肯定的是,即使它是默认行为,我已将此部分添加到我的ejb-jar.xml会话bean:

<security-identity>
   <use-caller-identity/>
</security-identity>
Run Code Online (Sandbox Code Playgroud)

我的会话bean不受任何角色的保护.

根据此IBM WebSphere信息中心部分,我还启用了系统属性com.ibm.CSI.rmiOutboundPropagationEnabled=true.

从技术上讲,服务调用在JBoss或WebSphere上都能正常工作.但是包含我在客户端上创建的自定义主体的JAAS主题不会传播到服务器.或者当然,Subject在JNDI上下文创建和EJB调用之前转储是正常的.

我为服务器和客户端运行相同的Java运行时版本(IBM Java6 SR9 FP2 ...),可MyPrincipal序列化类在服务器ClassPath中可用(AppServer/lib/ext对于WebSphere,server/default/lib对于JBoss)

WebSphere转储:

[8/31/12 11:56:26:514 CEST] 00000024 SystemOut     O getNewMessage principal: UNAUTHENTICATED
[8/31/12 11:56:26:515 CEST] 00000024 SystemOut     O Current Subject: null
Run Code Online (Sandbox Code Playgroud)

JBoss转储:

 12:30:20,540 INFO  [STDOUT] getNewMessage principal: anonymous
 12:30:20,540 INFO  [STDOUT] Current Subject: null
Run Code Online (Sandbox Code Playgroud)

当然,我错过了某种魔法咒语.你知道哪一个吗?

pgl*_*zen 3

我怀疑您没有在 WAS 服务器上启用安全性。由于未启用安全性并且您未向 WAS 进行身份验证,因此没有凭证。因此,您的调用getCallerPrincipal将返回 UNAUTHENTICATED。

如果您在 WAS 中打开应用程序安全性,则必须通过CSIv2 协议进行身份验证。在独立客户端中创建您自己的 JAAS 主题是行不通的。如果可以的话,那么任何人都可以创建“嘿,是我”凭证并登录到他们想要的任何远程 EJB。

通过将您的主题附加到正在运行的执行线程,您的代码将在服务器上运行。通过网络传输主体/凭证需要一个协议来实现主体信息的序列化并确保在凭证中声明身份的一方的信任。WAS 从独立客户端接受基本授权、LTPA 和 kerberos 形式的用户信息。这可以在管理控制台内的入站 CSIv2 配置上进行配置。它记录在我之前引用的信息中心链接中。

这是有趣的事情。祝你好运。