我在调用在同一台机器上运行的另一个Wildfly实例上部署的远程EJB时遇到了问题。我已经按照this链接来设置EJB调用。我有2个应用程序(都使用keycloak保护)说my-caller.ear和my-callee.ear部署在不同的服务器实例上。结构如下:
**my-caller-app.ear**
|
|-----lib
|-----META-INF
|-----jboss-ejb-client.xml
|-----jboss-app.xml
|-----application.xml
|-----my-web.war
|------ WEB-INF
|----- beans.xml
|----- jboss-web.xml [<security-domain>keycloak</security-domain>]
|----- keycloak.json
|----- web.xml
|---- my-ejb.jar
|---- <org.myapp.ejb.*> // EJB classes
|---- META-INF
|-----jboss-ejb3.xml [<s:security-domain>keycloak</s:security-domain>]
|-----persistence.xml
**my-callee-app.ear**
|
|-----lib
|-----META-INF
|-----jboss-app.xml
|-----application.xml
|-----my-web2.war
|------ WEB-INF
|----- beans.xml
|----- jboss-web.xml [<security-domain>keycloak</security-domain>]
|----- keycloak.json
|----- web.xml
|---- my-ejb2.jar
|---- <org.myapp.ejb.*> // EJB classes
|---- META-INF
|-----jboss-ejb3.xml [<s:security-domain>keycloak</s:security-domain>]
|-----persistence.xml
我按如下方式注入了我的CalleeBean的远程接口:
@Resource(lookup="ejb:my-callee-app-0.0.1-SNAPSHOT/my-ejb2/CalleeBean!com.business.CalleeBeanRemote")
CalleeBeanRemote calleeService;
我对keycloak的standalone.xml配置如下(两个服务器)。此外, default-security-domain 设置为 keycloak :
<default-security-domain value="keycloak"/>
......
......
<security-domain name="keycloak">
<authentication>
<login-module code="org.keycloak.adapters.jboss.KeycloakLoginModule" flag="required"/>
</authentication>
</security-domain>
每当我尝试在远程EJB上调用任何方法时,它都会在两个服务器实例上抛出以下异常:
javax.ejb.EJBAccessException:WFLYSEC0027:无效用户
我在远程服务器(被调用者服务器)上启用了跟踪日志记录,如下所示:
2017-07-15 19:54:23,867 TRACE [org.jboss.security](默认任务-47) PBOX00200:Begin isValid,principal:ejb,cache entry:null 2017-07-15 19:54:23,868 TRACE [org.jboss.security](默认任务-47)PBOX00209: defaultLogin,principal:ejb 2017-07-15 19:54:23,868 TRACE [org.jboss.security](默认任务-47)PBOX00221:开始 getAppConfigurationEntry(keycloak),大小:6 2017-07-15 19:54:23,868 TRACE [org.jboss.security](默认任务-47)PBOX00224:结束 getAppConfigurationEntry(keycloak),AuthInfo:AppConfigurationEntry []: [0] LoginModule类:org.keycloak.adapters.jboss.KeycloakLoginModule ControlFlag:LoginModuleControlFlag:required选项:
2017-07-15 19:54:23,868 DEBUG [org.jboss.security](默认任务-47) PBOX00206:登录失败:javax.security.auth.login.LoginException: 无法找到LoginModule类: 来自[Module。的org.keycloak.adapters.jboss.KeycloakLoginModule “deployment.my-callee-app-0.0.1-SNAPSHOT.ear.my-ejb2.jar:main”来自 服务模块加载器] javax.security.auth.login.LoginContext.invoke(LoginContext.java:794) 在 javax.security.auth.login.LoginContext.access $ 000(LoginContext.java:195) 在 javax.security.auth.login.LoginContext中$ 4.run(LoginContext.java:682) 在 javax.security.auth.login.LoginContext中$ 4.run(LoginContext.java:680) 在java.security.AccessController.doPrivileged(Native Method)at javax.security.auth.login.LoginContext.invokePriv(LoginContext.java:680) 在 javax.security.auth.login.LoginContext.login(LoginContext.java:587) 在 org.jboss.security.authentication.JBossCachedAuthenticationManager.defaultLogin(JBossCachedAuthenticationManager.java:406) 在 org.jboss.security.authentication.JBossCachedAuthenticationManager.proceedWithJaasLogin(JBossCachedAuthenticationManager.java:345) 在 org.jboss.security.authentication.JBossCachedAuthenticationManager.authenticate(JBossCachedAuthenticationManager.java:333) 在 org.jboss.security.authentication.JBossCachedAuthenticationManager.isValid(JBossCachedAuthenticationManager.java:146) 在 org.jboss.as.security.service.SimpleSecurityManager.authenticate(SimpleSecurityManager.java:406) 在 org.jboss.as.security.service.SimpleSecurityManager.authenticate(SimpleSecurityManager.java:367) 在 org.jboss.as.ejb3.security.SecurityContextInterceptor $ 1.run(SecurityContextInterceptor.java:55) 在 org.jboss.as.ejb3.security.SecurityContextInterceptor $ 1.run(SecurityContextInterceptor.java:49)
令人惊讶的是,当我在同一台服务器上部署我的两个应用程序时,它运行得非常好
我确信这是远程服务器上的一些安全问题,而不是远程问题。我认为keycloak已经保护了我的Web层,而不是EJB(不确定)。我在这个问题上停留了很长一段时间了。
任何帮助将受到高度赞赏。感谢