我创建了一个EJB 3并部署在wildfly
上@Stateless
@Remote(ICoreParameterService.class)
@RolesAllowed("$APP_USER$")
@SecurityDomain("AppJaasRealm")
public class CoreParameterService extends BaseService implements ICoreParameterService{
some public functions;
} 当EJB和Web部署在同一台服务器上时,一切都很完美。 现在我想通过在tomcat上部署Web应用程序或从swing应用程序调用EJB来调用EJB 下面是我的客户端,如果我从EJB
中删除@RolesAllowed,@ SecureDomain,它的工作方式非常完美public class TestStatelessSessionBeans {
public static void main(String arg[]){
try {
final Properties clientConfigProps = new Properties();
clientConfigProps.put("remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED", "false");
clientConfigProps.put("remote.connection.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS","false");
clientConfigProps.put("remote.connection.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT","false");
clientConfigProps.put("remote.connections", "default");
clientConfigProps.put("remote.connection.default.host", "localhost");
clientConfigProps.put("remote.connection.default.port", "8080");
clientConfigProps.put("remote.connection.default.protocol", "http-remoting");
clientConfigProps.put("remote.connection.default.username", "admin"); // JAAS user
clientConfigProps.put("remote.connection.default.password", "sohail"); // JAAS password ; the encryption of pwd is 36+e2V2o0eKO3DOMG2YHI4Qd6NWL1wpd4S0z3sTuo90=
final EJBClientConfiguration ejbClientConfiguration = new PropertiesBasedEJBClientConfiguration(clientConfigProps);
final ContextSelector<EJBClientContext> ejbClientContextSelector = new ConfigBasedEJBClientContextSelector(ejbClientConfiguration);
EJBClientContext.setSelector(ejbClientContextSelector);
final Properties jndiProperties = new Properties();
jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
Context context = new InitialContext(jndiProperties);
String lookUpName ="java:global/fortune-ear/fortune-service/CoreParameterService!com.autosoft.fortune.interfaces.ICoreParameterService";
lookUpName ="ejb:fortune-ear/fortune-service/CoreParameterService!com.autosoft.fortune.interfaces.ICoreParameterService";
ICoreParameterService service = (ICoreParameterService)context.lookup(lookUpName);
List<ApplicationParameterHeaderDTO> list = service.getApplicationParameterHeaderList("200000");
System.out.println(list);
System.out.println ("Object Saved..!!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
否则我收到错误JBAS013323:用户无效
standalone.xml中的My Security域代码如下所示
<security-domain name="AppJaasRealm" cache-type="default">
<authentication>
<login-module code="Database" flag="required">
<module-option name="dsJndiName" value="java:/jdbc/fortuneDataSource"/>
<module-option name="principalsQuery" value="select vUser_Password from userinformation where vLogin_ID= ?"/>
<module-option name="rolesQuery" value="select '$APP_USER$', 'Roles' from userinformation where vLogin_ID= ?"/>
<module-option name="hashAlgorithm" value="SHA-256"/>
<module-option name="hashEncoding" value="Base64"/>
</login-module>
</authentication>
</security-domain>
什么是摆脱“JBAS013323:无效用户”错误并成功调用Rmote EJB的解决方案。 我看过tonz的帖子,但无法找到从远程调用我的EJB的正确解决方案。 我试图将所有可能的条目放在jndi属性和客户端属性中,但没有成功。
答案 0 :(得分:0)
尝试在安全域下添加远程验证:
<security-domain name="AppJaasRealm" cache-type="default">
<authentication>
<login-module code="Remoting" flag="optional">
<module-option name="password-stacking" value="useFirstPass"/>
</login-module>
<login-module code="Database" flag="required">
<module-option name="dsJndiName" value="java:/jdbc/fortuneDataSource"/>
<module-option name="principalsQuery" value="select vUser_Password from userinformation where vLogin_ID= ?"/>
<module-option name="rolesQuery" value="select '$APP_USER$', 'Roles' from userinformation where vLogin_ID= ?"/>
<module-option name="hashAlgorithm" value="SHA-256"/>
<module-option name="hashEncoding" value="Base64"/>
</login-module>
</authentication>
</security-domain>