我正在使用自定义主体测试JAAS 主题从在原始 Java 运行时上运行的独立 EJB 客户端到 JavaEE 服务器的传播。我的目标是 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);
服务器端代码为:
public String getNewMessage(String msg) {
System.out.println("getNewMessage principal: " + sessionContext.getCallerPrincipal());
System.out.println("Current Subject: " + Subject.getSubject(AccessController.getContext()));
return "getNewMessage: " + msg;
}
可以肯定的是,即使它是默认行为,我也已将此部分添加到我的ejb-jar.xml
会话 bean 中:
<security-identity>
<use-caller-identity/>
</security-identity>
我的会话 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
JBoss 转储:
12:30:20,540 INFO [STDOUT] getNewMessage principal: anonymous
12:30:20,540 INFO [STDOUT] Current Subject: null
当然,我错过了某种魔法。你知道是哪一个吗?