当前位置: 首页 > 知识库问答 >
问题:

调用远程ejb使用Wildfly 9.0.1返回无效用户

翟学文
2023-03-14

如果我在Wildfly中使用默认的安全域设置,我可以成功调用远程EJB。我访问此安全域根本没有检查任何用户凭据。在实现或使用检查数据库中用户名和密码的安全域后,我遇到了下面的异常。

我不知道我错过了什么。我希望这里有人能给我指出一个正确的方向。

例外情况:

Exception in thread "main" javax.ejb.EJBAccessException: WFLYSEC0027: Invalid User
at org.jboss.as.ejb3.security.SecurityContextInterceptor$1.run(SecurityContextInterceptor.java:69)
at org.jboss.as.ejb3.security.SecurityContextInterceptor$1.run(SecurityContextInterceptor.java:49)
at org.jboss.as.ejb3.security.SecurityContextInterceptor.processInvocation(SecurityContextInterceptor.java:97)
...

jboss-ejb3。xml:

<jboss:jboss
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:jboss="http://www.jboss.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:s="urn:security:1.1"
    version="3.1" impl-version="2.0">

<assembly-descriptor>
    <s:security>
        <!-- Even wildcard * is supported -->
        <ejb-name>*</ejb-name>
        <!-- Name of the security domain which is configured in the EJB3 subsystem -->
        <s:security-domain>ejb-database-policy</s:security-domain>
    </s:security>
</assembly-descriptor>

独立。xml

<security-domain name="ejb-database-policy" cache-type="default">
    <authentication>
        <login-module code="Database" flag="required">
            <module-option name="dsJndiName" value="java:/jdbc/mysqlds"/>
            <module-option name="principalsQuery" value="SELECT user_password FROM app_user WHERE username=?"/>
            <module-option name="rolesQuery" value="SELECT role, 'Roles' FROM user_role WHERE username=?"/>
            <module-option name="hashAlgorithm" value="SHA-256"/>
            <module-option name="hashEncoding" value="base64"/>
            <module-option name="unauthenticatedIdentity" value="guest"/>
        </login-module>
    </authentication>
</security-domain>

TestRemote。Java语言

public class TestRemote {
public static void main(String[] args) {
    new TestRemote().exec();
}

public void exec() {
    try {
        Hashtable prop = new Hashtable();
        prop.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
        prop.put(Context.PROVIDER_URL, "http-remoting://127.0.0.1:8080");
        prop.put(Context.SECURITY_PRINCIPAL, "anonymous");
        prop.put(Context.SECURITY_CREDENTIALS, "admin");

        prop.put("jboss.naming.client.ejb.context", true);

        Context context = new InitialContext(prop);

        final String ejb = "/MyAppEar/MyAppEjb//UserBean!com.test.controller.UserBeanRemote";
        UserBeanRemote bean = (UserBeanRemote)context.lookup(ejb);


        List<AppUser> users = bean.getUserList(null, 0, 0);
        if(users != null) {
            for(AppUser user: users) {
                System.out.println("UserID: " + user.getUserId() + ", username:" + user.getUsername());
            }               
        } else {
            System.out.println("User list is empty");
        }

    } catch(NamingException e) {
        e.printStackTrace();
    }
}
}

谢谢,贝尔

共有1个答案

严瑞
2023-03-14

问题解决了。

以下是我所做的额外步骤/设置。

1) 在单机版中。xml,我将ApplicationRealm身份验证更改为JAAS。

    <security-realm name="ApplicationRealm">
    <authentication>
        <jaas name="ejb-database-policy"/>
    </authentication>
    <authorization>
        <properties path="application-roles.properties" relative-to="jboss.server.config.dir"/>
    </authorization>
</security-realm>

2) 在TestRemote中。java,我添加了属性。put(“jboss.naming.client.connect.options.org.xnio.options.SASL\u POLICY\u NOPLAINTEXT”,“false”)

那是它。

谢谢,贝尔

 类似资料:
  • 我试图使用JBoss7.1.1中的JNDI从远程客户端调用,但我得到了一个异常: 我使用的是jboss的安全机制,并且我已经通过add-user.bat添加了用户,还有带有用户名和密码的jboss-ejb-client.properties文件,但仍然会得到异常。我遵循了链接的示例集:使用JNDI从远程客户端进行EJB调用,当我不使用安全机制时也是如此,但是当我使用安全机制时,就会出现错误 你错过

  • 我需要帮助从Spring调用EJB远程接口。 web应用程序部署在同一个JBoss服务器中。但是当我尝试部署时,我得到一个命名异常'ServiceBean'未绑定。我必须在web.xml中添加环境条目才能访问EJB吗(即使EJB和web应用程序都部署在同一个JBoss中)?

  • 我的要求是 我有两台机器,客户端和服务器。在服务器上,只有一个端口是打开的(不应该是JNDI端口)。客户端需要对部署在服务器中的EJB远程对象的引用,以便它可以调用这些EJB对象上的方法。 在这里,我计划在Server上的开放端口上进行客户端和服务器之间的RMI通信。获得调用后,服务器将把EJB3对象返回给客户端。 这是我的问题 RMI是否允许将远程EJB3引用返回给客户端? 如果是,一旦EJB引

  • 当我尝试从远程客户端访问在JBoss EAP 6.2中运行的EJB时,我收到以下异常: 我将这些属性用于调用远程ejb方法。 endpoint.name=客户端endpointremote.connectionprovider.create.options.org.xnio.选项。SSL_ENABLED=falseremote.connections=默认remote.connection.def

  • 我有一个应用程序,它有一个EJB,它注入了由CDI生成的实体管理器。同一服务器(wildfly 9)/JVM上的另一个应用程序将使用此EJB从实体管理器获取结果。 EJB的第一次调用将返回预期结果。当调用返回时,它生成实体管理器,获取数据并再次处理实体管理器。由于关闭了实体管理器,该EJB的每个后续调用都将抛出一个错误。未对新实体经理进行生产/处置。 这是预期的巴哈维奥吗?我的代码中有错误吗? 这

  • 我目前的问题是,我的机器上运行了两个Wildfly 8.2.0最终实例。我知道,有类似的问题,但没有一个真正有助于我的问题。其中一个拥有一个宁静的应用程序,当它收到GET时,它会触发无状态会话Bean。之后,此无状态会话 Bean 应从远程无状态会话 Bean 调用方法该方法位于另一个 wildfly 实例上。 我将从解释我到目前为止所做的事情开始(也许我错过了一些东西,我对Java EE和Wil