gpt4 book ai didi

java - 为什么在 TomEE 上远程调用 EJB 时会收到 AuthenticationException?

转载 作者:太空宇宙 更新时间:2023-11-04 11:32:19 24 4
gpt4 key购买 nike

我有一个 ejb 在 TomEE 7.0.3 服务器上运行。顺便说一句,所有这些都在 Tomee 1.7.4 中运行。我使用 tomcat-users.xml 文件设置了一组用户

<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>

我能够访问网址http://127.0.0.1/tomee/ejb通过提供用户“admin”的凭据。我的 server.xml 文件具有以下条目

<Resource auth="Container" description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase"
pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase" />

    <Realm className="org.apache.catalina.realm.LockOutRealm">
<!-- This Realm uses the UserDatabase configured in the global JNDI resources
under the key "UserDatabase". Any edits that are performed against this UserDatabase
are immediately available for use by the Realm. -->
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase" />
</Realm>

问题是当我尝试远程调用 ejb 时,我的 JNDI InitialContext 使用以下属性。

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

以下是调用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)

有人能解释一下吗?

最佳答案

使用 tomcat-users.xml 假设您在 server.xml 中使用 UserDatabaseRealm 作为领域,但情况可能并非如此(您的问题中未写)。这还假设身份验证是通过 servlet/tomcat 主干完成的。默认情况下情况并非如此,直到您添加到 tomee webapp(您可以物理创建它并定义 ejbd servlet - 请参阅 http://tomee.apache.org/ejbd-transport.html - 执行 request.login() 的过滤器。

使用ejbd协议(protocol)的tomee将自动使用tomee安全服务登录,该安全服务默认依赖于server.xml的第一个领域。

关于java - 为什么在 TomEE 上远程调用 EJB 时会收到 AuthenticationException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43658309/

24 4 0
文章推荐: linux - 玩弄 LD_LIBRARY_PATH
文章推荐: html -
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com