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

标签 java jakarta-ee ejb-3.0 apache-tomee tomee-7

我有一个 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/

相关文章:

java - 参数中的 3 个点是什么?/什么是可变元数 (...) 参数?

java - 为什么 java.util.HashSet 没有 get(Object o) 方法?

java - 在 JBoss 4.2.3 中获取 EJB 方法调用者的 IP 地址

jsf - 将 EJB3.0 Bean 注入(inject) JSF2.0 支持 Bean... 不可能?

java - jxl 中程序关闭时数据损坏

java - 如何将图像添加到 GridView 并为这些图像添加点击功能?

基于 C# .NET 文档的应用程序操作图

google-app-engine - Google App Engine 全局变量 (ServletContext)

java - Java 代码可以判断它是否在应用服务器中吗?

java - 在 Jboss 4.2.3 中部署了 EJB3。我们如何访问它?