2012-05-04 6 views
2

У меня есть некоторое ухо развернут на JBoss AS7 с JBOSS-app.xmlJBoss AS 7 удаленный автономный клиент аутентификации

<jboss-app xmlns="http://www.jboss.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     version="7.0" xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee "> 
<security-domain>FooDomain</security-domain> 

В standalone.xml У меня

<security-realm name="ApplicationRealm"> 
    <authentication> 
     <jaas name="FooDomain"/> 
    </authentication> 
</security-realm> 
... 
<security-domain name="FooDomain" 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:/MyDS"/> 
     <module-option name="principalsQuery" value="select password from users where user_id=?"/> 
     <module-option name="rolesQuery" value="select role, 'Roles' from roles where user_id=?"/> 
     <module-option name="password-stacking" value="useFirstPass"/> 
    </login-module> 
</authentication> 
</security-domain> 

Я могу найти некоторый ejb от автономного клиента, и аутентификация прошла успешно, когда я использую такой код:

final Hashtable<Object, Object> p = new Hashtable<Object, Object>(); 
p.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); 
p.put(Context.SECURITY_PRINCIPAL, username); 
p.put(Context.SECURITY_CREDENTIALS, password); 
p.put("jboss.naming.client.ejb.context", true); 
p.put(Context.PROVIDER_URL, "remote://10.10.1.18:4447"); 
p.put("jboss.naming.client.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT", "false"); 
p.put(Context.INITIAL_CONTEXT_FACTORY, org.jboss.naming.remote.client.InitialContextFactory.class.getName()); 
context = new InitialContext(p); 

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

javax.security.sasl.SaslException: Authentication failed: all available authentication mechanisms failed 

, но я не могу поймать его.

Журналы сервера (не важные части вырезанные):

TRACE [DatabaseServerLoginModule] initialize 
TRACE [DatabaseServerLoginModule] Security domain: FooDomain 
TRACE [DatabaseServerLoginModule] DatabaseServerLoginModule, dsJndiName=java:/MyDS 
TRACE [DatabaseServerLoginModule] principalsQuery=select password from users where user_id=? 
TRACE [DatabaseServerLoginModule] rolesQuery=select role, 'Roles' from roles where user_id=? 
TRACE [DatabaseServerLoginModule] suspendResume=true 
TRACE [DatabaseServerLoginModule] login 
TRACE [DatabaseServerLoginModule] suspendAnyTransaction 
TRACE [DatabaseServerLoginModule] Excuting query: select password from users where user_id=?, with username: test 
TRACE [DatabaseServerLoginModule] Obtained user password 
TRACE [DatabaseServerLoginModule] resumeAnyTransaction 
DEBUG [DatabaseServerLoginModule] Bad password for username=test 
TRACE [DatabaseServerLoginModule] abort 

Когда я пытаюсь использовать LoginContext просто ничего не происходит на сервере. Конфигурация

public class DefaultJassConfiguration extends Configuration { 
@Override 
public AppConfigurationEntry[] getAppConfigurationEntry(String name) { 
    Map options = new HashMap(); 
    options.put("debug", true); 
    AppConfigurationEntry[] entries = { 
      new AppConfigurationEntry("org.jboss.security.ClientLoginModule", AppConfigurationEntry.LoginModuleControlFlag.REQUIRED, options) 
    }; 
    return entries; 
} 
} 

Тест

Configuration.setConfiguration(new DefaultJassConfiguration()); 
try { 
     LoginContext lc = new LoginContext("FooDomain", new UsernamePasswordHandler("test", "test".toCharArray())); 
     lc.login(); 
     System.out.println(lc.getSubject()); 
    } catch (LoginException e) { 
     e.printStackTrace(); 
    } 

Возможно LoginContext не знаю адрес сервера? Я пытаюсь добавить

System.setProperty("java.naming.provider.url", "remote://10.10.1.18:4447"); 

но без эффекта.

Как сделать работу LoginContext? Или как поймать SaslException? Я считаю, что некоторый фиктивный компонент с методом всегда возвращался true и называть его после входа в систему, но он выглядит уродливым.

P.S. Прошу прощения за мой английский (это заставляет меня немного застенчиво)

+0

Вы хотите поймать исключение на клиенте? – DaTroop

+0

Да на стороне клиента – fpu

+0

Вы можете попробовать расширить класс модуля безопасности и обернуть код проверки безопасности в try/catch. Если вы получите исключение, чтобы вернуть его клиенту. Я просто надеюсь, что это еще не значит, что Исключение подавлено. – DaTroop

ответ

0

В настоящее время ClientLoginModule не поддерживается в AS7 - все, что делает модуль входа в систему, связывает имя пользователя и пароль с локальным потоком, он не выполняет никакой реальной аутентификации.

Что касается InitialContext, вы должны увидеть исключение, возникшее при попытке его использовать.

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