使用自定义登录模块与JBoss EJB进行独立连接

时间:2015-09-18 22:28:41

标签: security jboss java-ee-6 ejb-3.1

我在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,但我得到相同的结果,“密码无效/需要密码”。

我会对任何想法感到非常高兴,因为我已经尝试了互联网对这个主题所说的一切。

1 个答案:

答案 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