1

我有一个在 TomEE 7.0.3 服务器上运行的 ejb。顺便说一句,所有这些都在 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>

通过提供用户“admin”的凭据,我能够访问 URL http://127.0.0.1/tomee/ejb 。我的 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)

任何人都可以对此有所了解吗?

4

1 回答 1

0

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

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

于 2017-04-30T15:34:21.687 回答