Java 为什么在远程调用TomEE上的EJB时会出现AuthenticationException?
我有一个运行在Tomee7.0.3服务器上的ejb。顺便说一句,所有这些都在1.7.4版中起作用。 我已经使用tomcat-users.xml文件设置了一组用户Java 为什么在远程调用TomEE上的EJB时会出现AuthenticationException?,java,jakarta-ee,ejb-3.0,apache-tomee,tomee-7,Java,Jakarta Ee,Ejb 3.0,Apache Tomee,Tomee 7,我有一个运行在Tomee7.0.3服务器上的ejb。顺便说一句,所有这些都在1.7.4版中起作用。 我已经使用tomcat-users.xml文件设置了一组用户 <tomcat-users> <role rolename="admin" /> <role rolename="admin-gui" /> <role rolename="admin-script" /> <role rolename="manage
<tomcat-users>
<role rolename="admin" />
<role rolename="admin-gui" />
<role rolename="admin-script" />
<role rolename="manager" />
<role rolename="manager-gui" />
<role rolename="manager-script" />
<role rolename="manager-jmx" />
<role rolename="manager-status" />
<role rolename="tomee-admin" />
<user
name="admin"
password="admin"
roles="admin,manager,admin-gui,admin-script,manager-gui,manager-script,manager-jmx,manager-status,tomee-admin" />
<role rolename="tomcat" />
<user
name="tomcat"
password="tomcat"
roles="tomcat" />
<user
name="manager"
password="manager"
roles="manager" />
</tomcat-users>
下面是调用ejb的代码
public static Object locateService(String serviceName) throws NamingException, IOException {
InputStream in = ServiceLocator.class.getClassLoader().getResourceAsStream("servicelocator.properties");
Properties p = new Properties();
p.load(in);
InitialContext ctx = new InitialContext(p);
return ctx.lookup("PaymentManagerRemote");
}
正如您所看到的,我提供了正确的用户名和密码,但我得到了以下异常
Apr 27, 2017 12:39:07 PM org.apache.openejb.client.EventLogger log
INFO: RemoteInitialContextCreated{providerUri=http://127.0.0.1:8082/tomee/ejb}
Exception in thread "main" javax.naming.AuthenticationException: Error while communicating with server: ; nested exception is:
javax.naming.AuthenticationException
at org.apache.openejb.client.JNDIContext.authenticate(JNDIContext.java:381)
at org.apache.openejb.client.JNDIContext.getInitialContext(JNDIContext.java:289)
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:684)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313)
at javax.naming.InitialContext.init(InitialContext.java:244)
at javax.naming.InitialContext.<init>(InitialContext.java:216)
at co.uk.meghdoot.core.util.ServiceLocator.locateService(ServiceLocator.java:20)
at co.uk.meghdoot.core.test.DeviceLocationTest.setUp(DeviceLocationTest.java:53)
at co.uk.meghdoot.core.test.DeviceLocationTest.main(DeviceLocationTest.java:109)
2017年4月27日12:39:07 PM org.apache.openejb.client.EventLogger日志
信息:RemoteInitialContextCreated{providerUri=http://127.0.0.1:8082/tomee/ejb}
线程“main”javax.naming.AuthenticationException中出现异常:与服务器通信时出错:;嵌套异常是:
javax.naming.AuthenticationException
位于org.apache.openejb.client.JNDIContext.authenticate(JNDIContext.java:381)
位于org.apache.openejb.client.JNDIContext.getInitialContext(JNDIContext.java:289)
位于javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:684)
位于javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313)
位于javax.naming.InitialContext.init(InitialContext.java:244)
位于javax.naming.InitialContext。(InitialContext.java:216)
位于co.uk.meghdoot.core.util.ServiceLocator.locateService(ServiceLocator.java:20)
位于co.uk.meghdoot.core.test.DeviceLocationTest.setUp(DeviceLocationTest.java:53)
位于co.uk.meghdoot.core.test.DeviceLocationTest.main(DeviceLocationTest.java:109)
有人能解释一下吗?使用tomcat-users.xml假设您使用UserDatabaseRealm作为server.xml中的领域,但情况可能并非如此(您的问题中没有写)。这还假设身份验证是通过servlet/tomcat主干完成的。默认情况下并非如此,直到您在tomee webapp中添加了它(您可以物理地创建它并定义ejbd servlet-请参阅-执行请求的筛选器。login()
使用ejbd协议,tomee将使用tomee安全服务自动登录,默认情况下,该服务将依赖于server.xml的第一个域。使用tomcat-users.xml时,假设您在server.xml中使用UserDatabaseRealm作为域,但情况可能并非如此(您的问题中没有说明)。这还假设身份验证是通过servlet/tomcat主干完成的。在添加到tomee webapp之前,默认情况下不是这样的(您可以物理创建它并定义ejbd servlet-请参阅-执行请求的筛选器。login()
使用ejbd协议,tomee将自动使用tomee安全服务登录,默认情况下,该服务将依赖于server.xml的第一个域。我已经通过了您发送的链接。我收到的错误是身份验证异常,而不是序列化错误。如果对白名单和黑名单进行任何更改,我应该可以要调用远程ejb,默认的黑名单应该可以正常工作而不做任何更改。您是否也正确设置了jaas(JVM系统属性+JAASRealm)?不,我没有设置jaas realm。这是TOME新版本的要求吗?您能否指出一些文档。对于新TOME,它在绕过tomcat层(ejbd)时始终依赖jaas。这篇文章解释了如何设置它。我可以从浏览器中看到localhost:8080/tomee/ejb页面,所以为什么远程客户端看不到它?我已经通过了您发送的链接。我得到的错误是一个AuthenticationException,而不是序列化错误。如果对白名单和黑名单进行任何更改,我应该能够对于远程ejb,默认黑名单应该可以正常工作,没有任何更改。您是否也正确设置了jaas(JVM系统属性+JAASRealm)?不,我没有设置jaas realm。这是新版本的tomee的要求吗?您能指出一些文档吗?对于新的tomee,它在绕过tomcat层(ejbd)时总是依赖jaas。这篇文章解释了如何设置它。我可以从浏览器中看到localhost:8080/tomee/ejb页面,为什么远程客户端看不到它?
java.naming.factory.initial=org.apache.openejb.client.RemoteInitialContextFactory
java.naming.provider.url=http://127.0.0.1:8082/tomee/ejb
java.naming.security.principal=admin
java.naming.security.credentials=admin
public static Object locateService(String serviceName) throws NamingException, IOException {
InputStream in = ServiceLocator.class.getClassLoader().getResourceAsStream("servicelocator.properties");
Properties p = new Properties();
p.load(in);
InitialContext ctx = new InitialContext(p);
return ctx.lookup("PaymentManagerRemote");
}
Apr 27, 2017 12:39:07 PM org.apache.openejb.client.EventLogger log
INFO: RemoteInitialContextCreated{providerUri=http://127.0.0.1:8082/tomee/ejb}
Exception in thread "main" javax.naming.AuthenticationException: Error while communicating with server: ; nested exception is:
javax.naming.AuthenticationException
at org.apache.openejb.client.JNDIContext.authenticate(JNDIContext.java:381)
at org.apache.openejb.client.JNDIContext.getInitialContext(JNDIContext.java:289)
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:684)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313)
at javax.naming.InitialContext.init(InitialContext.java:244)
at javax.naming.InitialContext.<init>(InitialContext.java:216)
at co.uk.meghdoot.core.util.ServiceLocator.locateService(ServiceLocator.java:20)
at co.uk.meghdoot.core.test.DeviceLocationTest.setUp(DeviceLocationTest.java:53)
at co.uk.meghdoot.core.test.DeviceLocationTest.main(DeviceLocationTest.java:109)