我在JBoss EAP 6.4.0.GA(AS 7.5.0.Final-redhat-21)中定义了自定义登录模块。
<login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule" flag="required">
<module-option name="dsJndiName" value="java:jboss/datasources/MySQLDS"/>
<module-option name="principalsQuery" value="SELECT password FROM xxx.User WHERE name=?"/>
<module-option name="rolesQuery" value="SELECT r.name, 'Roles' FROM xxx.Role r JOIN xxx.User_Roles ur ON r.id=ur.role_id JOIN xxx.User u ON ur.user_id=u.id WHERE u.name=?"/>
<module-option name="hashAlgorithm" value="SHA-256"/>
<module-option name="hashEncoding" value="hex"/>
<module-option name="password-stacking" value="useFirstPass"/>
它(成功)连接到MySQL以检索用户名,密码和角色。 EJB使用@RolesAllowed(值=“管理员”)注释 @SecurityDomain(value =“xxx”)。当我使用Web应用程序连接到EJB或使用具有基本身份验证的Web服务时,它连接正常(现在仍然)。用户已正确验证身份。但是,使用以下“独立”代码我无法验证用户身份:
final EJBClientConfiguration ejbClientConfiguration = new PropertiesBasedEJBClientConfiguration(
this.properties);
final ConfigBasedEJBClientContextSelector selector = new ConfigBasedEJBClientContextSelector(
ejbClientConfiguration);
EJBClientContext.setSelector(selector);
final Context context = new InitialContext(this.properties);
final String ejbConnectionString = ejbConnectionInformation.getEJBConnectionString();
final T ejbInterface = (T) context.lookup(ejbConnectionString);
ejbConnection = new EJBConnection<T>(context, ejbInterface);
...
ejb属性如下:
remote.connections = default
remote.connection.default.host = localhost
remote.connection.default.port = 4447
remote.connection.default.username = <username>
remote.connection.default.password = <plain text password>
remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED = false
java.naming.factory.url.pkgs = org.jboss.ejb.client.naming
我也尝试了各种组合:
#remote.connection.default.protocol=http-remoting
#jboss.naming.client.connect.options.org.xnio.Options.SASL_DISALLOWED_MECHANISMS=JBOSS-LOCAL-USER
#remote.connection.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT=false
#remote.connection.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
#jboss.naming.client.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=true
#jboss.naming.client.connect.options.org.xnio.Options.SASL_DISALLOWED_MECHANISMS=JBOSS-LOCAL-USER
#jboss.naming.client.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT=false
打开JBoss日志后,我看到它失败了,因为密码不正确,即:
TRACE [org.jboss.security] (EJB default - 2) PBOX000236: Begin initialize method
DEBUG [org.jboss.security] (EJB default - 2) PBOX000281: Password hashing activated, algorithm: SHA-256, encoding: hex, charset: null, callback: null, storeCallBack: null
TRACE [org.jboss.security] (EJB default - 2) PBOX000262: Module options [dsJndiName: java:jboss/datasources/MySQLDS, principalsQuery: SELECT password FROM xxx.User WHERE name=?, rolesQuery: SELECT r.name, 'Roles' FROM xxx.Role r JOIN xxx.User_Roles ur ON r.id=ur.role_id JOIN xxx.User u ON ur.user_id=u.id WHERE u.name=?, suspendResume: true]
TRACE [org.jboss.security] (EJB default - 2) PBOX000240: Begin login method
TRACE [org.jboss.security] (EJB default - 2) PBOX000263: Executing query SELECT password FROM xxx.User WHERE name=? with username <username>
DEBUG [org.jboss.security] (EJB default - 2) PBOX000283: Bad password for username <username>
TRACE [org.jboss.security] (EJB default - 2) PBOX000244: Begin abort method
DEBUG [org.jboss.security] (EJB default - 2) PBOX000206: Login failure: javax.security.auth.login.FailedLoginException: PBOX000070: Password invalid/Password required
at org.jboss.security.auth.spi.UsernamePasswordLoginModule.login(UsernamePasswordLoginModule.java:286) [picketbox-4.1.1.Final-redhat-1.jar:4.1.1.Final-redhat-1]
在添加JBoss登录模块和EJB上的安全注释之前,我应该提一下正确连接到EJB的相同代码。
还应该注意的是,如果我将用户名更改为未存储在数据库中的用户名,我会得到一个不同的错误,所以这证明它正在进入数据库,但问题确实是密码问题没有正确匹配,即使它完全匹配数据库中的'哈希'版本。我也尝试将'hashed'版本添加到ejb属性中但没有成功。
DEBUG [org.jboss.security] (EJB default - 1) PBOX000206: Login failure: javax.security.auth.login.FailedLoginException: PBOX000062: No matching username found found in principals
我也尝试将jboss-remote-naming的版本从2.0.3.Final升级到2.0.4.Final,xnio-nio从3.3.0.Final升级到3.3.2.Final,以及jboss-ejb -client从1.0.28.Final到1.0.31.Final,但我得到相同的结果,“密码无效/需要密码”。
我会对任何想法感到非常高兴,因为我已经尝试了互联网对这个主题所说的一切。
答案 0 :(得分:1)
好的,它现在正在运作。缺少的部分是:
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=true
remote.connection.default.connect.options.org.xnio.Options.SASL_DISALLOWED_MECHANISMS=JBOSS-LOCAL-USER
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT=false
注意:将上面的“default”替换为你在“remote.connections”中配置的内容。
在“standalone.xml”的“security-realms”部分或等效内容中输入以下内容:
<security-realm name="xxxRealm">
<authentication>
<jaas name="xxx"/>
</authentication>
</security-realm>
其中“xxx”是“安全域”的名称。要配置远程处理,请添加以下内容:
<subsystem xmlns="urn:jboss:domain:remoting:1.2">
<connector name="remoting-connector" socket-binding="remoting" security-realm="xxxRealm"/>
</subsystem>
然后将以下内容添加到您的“security-domain”(假设您拥有如上所述的“DatabaseServiceLoginModule”:
<login-module code="Remoting" flag="optional">
<module-option name="password-stacking" value="useFirstPass"/>
</login-module>
Credit转到具有缺失/正确配置属性的以下内容:https://community.jboss.org/wiki/JBossAS7RemoteEJBAuthenticationHowto