我正在使用自定义主体测试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信息中心部分
,我还启用了system属性com.ibm.CSI.rmiOutboundPropagationEnabled=true
。
从技术上讲,该服务调用可以在JBoss或WebSphere上正常工作。但是,包括在客户端上创建的我的自定义主体在内的JAAS主题不会传播到服务器。或者,当然,在Subject
创建JNDI上下文和EJB调用之前转储就可以了。
我为服务器和客户端(IBM Java6 SR9 FP2
…)运行相同的Java运行时版本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
返回未经授权的状态。
如果在WAS中打开应用程序安全性,则必须通过CSIv2协议进行身份验证。在独立客户端中创建自己的JAAS主题将无法完成。如果可以,那么任何人都可以创建“嘿,是我”凭证,然后登录到他们想要的任何远程EJB。
通过将您的主题附加到运行中的执行线程,您的代码将在服务器上工作。主题/凭证流经电线需要协议来实现主题信息的序列化,并确保在凭证中声明身份的一方的信任。从一个独立的客户端,WAS接受基本授权,LTPA和kerberos形式的用户信息。可以在管理控制台内的入站CSIv2配置上进行配置。我早先引用的“信息中心”链接中对此进行了记录。
这很有趣。祝好运。
我试图使用JBoss7.1.1中的JNDI从远程客户端调用,但我得到了一个异常: 我使用的是jboss的安全机制,并且我已经通过add-user.bat添加了用户,还有带有用户名和密码的jboss-ejb-client.properties文件,但仍然会得到异常。我遵循了链接的示例集:使用JNDI从远程客户端进行EJB调用,当我不使用安全机制时也是如此,但是当我使用安全机制时,就会出现错误 你错过
我正在尝试从瘦客户端对WebSphere Liberty20.0.0.10(JDK 8)进行远程EJB 3调用。客户端不在EJB容器中运行。我谷歌了这个页面,并尝试按照说明进行操作:https://www.ibm.com/support/knowledgecenter/SSD28V_liberty/com.ibm.websphere.wlp.core.doc/ae/twlp_ejb_remote.
问题内容: 根据EJB客户端应用程序上的Netbeans教程,我似乎无法调用该方法: 编译错误: 客户: ejb: 远程接口: 现在,如果接口被修改: Bean现在可以使用以下方法: 但是,有一个NPE: 如何正确调用该方法?EJB未实例化? 问题答案: 我从头开始。我能想到的唯一区别是,我没有创建EJB应用程序,而是为bean创建了EJB模块。否则,我认为是相同的。 结构体: 客户代码: 豆:
问题内容: 我在远程Glassfish服务器和计算机上的应用程序客户端中都有一个EJB模块。我想从应用程序客户端连接到远程EJB。 这是我的EJB接口: 这是我的ejb: 我有几个问题: 我可以在远程应用程序客户端中使用依赖注入来连接到ejb吗?如果是这样,我该怎么做才能做到这一点。我是否需要在sun-ejb-jar.xml和sun-application-client.xml中进行配置?换句话说
我需要能够从这个简单的摇摆java应用程序调用保存()方法到我的Web应用程序,该应用程序在服务器上发布,其中包含我用来保存新实体类型类角色的bean,该类具有名称、地址、电子邮件。 我在使用wildfly 8。x代表我的服务器,并按以下方式发布我的web应用: 这是我的ContactoDAO Bean: 在我的简单客户端swing应用程序上,我的设置如下: 您可以在上面的代码中看到我使用它来调用
问题内容: 我正在尝试了解JAAS主体如何从Web层传播到Business / EJB层。 我已经阅读过,如果角色/领域是在 web.xml的* login-config 和 security-context 中 配置的 ,那么servlet容器还将透明地将经过身份验证的主体传递给EJB层。 * 两个问题 1.)首先,更重要的是,这是真的吗?无需开发人员的任何干预! 2)其次,任何想法都是在后台进