gpt4 book ai didi

java - 从纯客户端调用远程 EJB(RMI over IIOP)时如何传播 JAAS Subject

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:24:37 24 4
gpt4 key购买 nike

我正在测试 JAAS Subject 的传播用custom Principal从运行在原始 Java 运行时上的独立 EJB 客户端到 JavaEE 服务器。我同时针对 JBoss 和 WebSphere 实现。

根据 this forum thread我曾预计它会很容易地与 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 session bean 中:

<security-identity>
<use-caller-identity/>
</security-identity>

我的 session bean 不受任何角色的保护。

根据 this IBM WebSphere infocenter section ,我还启用了系统属性 com.ibm.CSI.rmiOutboundPropagationEnabled=true

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

我为服务器和客户端运行相同的 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

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

最佳答案

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

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

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

这很有趣。祝你好运。

关于java - 从纯客户端调用远程 EJB(RMI over IIOP)时如何传播 JAAS Subject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12213734/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com