2015-09-18 5 views
1

У меня есть пользовательский модуль входа в систему, определенный в 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, но я получаю тот же результат: «Пароль недействителен/требуется пароль».

Я буду очень рад за любые идеи, потому что я пробовал практически все, что интернет должен сказать по этому вопросу.

+0

Я подозреваю, что моя проблема связана с тем, что у меня нет области, настроенной для «удаленного доступа» JBoss, и чтобы имя пользователя/пароль проверялось на неправильное царство, т.е.: <подсистема XMLNS = "урну: JBoss: домен: Remoting: 1.2"> <имя соединителя = "Remoting-разъем" сокет-связывающий = "Remoting" безопасность-область = "xxxRealm" /> я теперь получить другую проблему. Когда у меня будет решение, я опубликую его. – Raoul

ответ

1

OK, сейчас он работает. Недостающие части были:

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 

NB: заменить «по умолчанию» в приведенном выше с тем, что вы настроили в «remote.connections».

В разделе «Безопасность-царствах» из «standalone.xml» или эквивалент введите следующее:

<security-realm name="xxxRealm"> 
    <authentication> 
     <jaas name="xxx"/> 
    </authentication> 
</security-realm> 

Где «ххх» это имя «безопасности-домена».Для настройки удаленного доступа добавить следующее:

<subsystem xmlns="urn:jboss:domain:remoting:1.2"> 
    <connector name="remoting-connector" socket-binding="remoting" security-realm="xxxRealm"/> 
</subsystem> 

Затем добавьте следующие строки в «безопасности-домена» (это при условии, что у вас есть «DatabaseServiceLoginModule», как и выше:

<login-module code="Remoting" flag="optional"> 
    <module-option name="password-stacking" value="useFirstPass"/> 
</login-module> 

Заслуга в после чего были отсутствующие/правильные свойства конфигурации: https://community.jboss.org/wiki/JBossAS7RemoteEJBAuthenticationHowto

Смежные вопросы