У меня есть пользовательский модуль входа в систему, определенный в JBoss EAP 6.4.0.GA (AS 7.5.0.Final-redhat-21).Автономное подключение к JBoss EJB с модулем пользовательского входа
<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 (value = "Administrator") @SecurityDomain (значение = "xxx"). Когда я подключаюсь к EJB с помощью веб-приложения или с помощью веб-службы с базовой аутентификацией, он соединяется нормально (все еще сейчас). Пользователь правильно аутентифицирован. Однако, используя следующий «автономный» код, который я не могу подтвердить подлинность пользователя:
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]
Я должен упомянуть, что тот же самый точный код правильно подключен к EJB, прежде чем добавить модуль регистрации JBoss и аннотации безопасности на EJB.
Следует также отметить, что если я изменю имя пользователя на то, которое не хранится в базе данных, я получаю другую ошибку, так что это доказывает, что она попадает в базу данных, но проблема действительно такова, пароль некорректно подобран, хотя он отлично соответствует версии хеширования в базе данных. Я также попытался добавить «хешированную» версию к свойствам 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-дистанционного именования из 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, но я получаю тот же результат: «Пароль недействителен/требуется пароль».
Я буду очень рад за любые идеи, потому что я пробовал практически все, что интернет должен сказать по этому вопросу.
Я подозреваю, что моя проблема связана с тем, что у меня нет области, настроенной для «удаленного доступа» JBoss, и чтобы имя пользователя/пароль проверялось на неправильное царство, т.е.: <подсистема XMLNS = "урну: JBoss: домен: Remoting: 1.2"> <имя соединителя = "Remoting-разъем" сокет-связывающий = "Remoting" безопасность-область = "xxxRealm" /> я теперь получить другую проблему. Когда у меня будет решение, я опубликую его. – Raoul