JBoss AS 7 remote standalone-client-auth

Ich habe ein paar ear-Bereitstellung auf JBoss AS7 mit
jboss-app.xml

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

In standalone.xml ich habe

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

Kann ich ein lookup für einige ejb-von standalone-client und-Authentifizierung erfolgreich ist, wenn ich code wie diesen:

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);

Das problem ist, dass wenn ich falsche Zugangsdaten, und ich sehe in der debug-Konsole

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

aber ich kann Sie nicht fangen.

Server-logs (nicht wichtige Teile geschnitten):

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

Wenn ich versuche, mit LoginContext nur passiert nichts auf dem server.
Konfiguration

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;
}
}

Test

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();
    }

Vielleicht LoginContext nicht wissen, die server-Adresse? Ich versuche, um

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

aber keinen Einfluss.

Wie man LoginContext Arbeit? Oder wie fangen SaslException?
Ich denke, dass einige dummy-bean mit der Methode immer true zurück und nennen es nach dem einloggen, sieht aber hässlich aus.

P. S. tut mir Leid für mein Deutsch (Es macht mich ein wenig schüchtern)

  • Sie wollen catch die Ausnahme auf dem client richtig?
  • Ja auf der client-Seite
  • Sie könnten versuchen, zu verlängern die security-Modul-Klasse und wickeln Sie den Sicherheits-check code in einem try/catch. In Fall, dass Sie eine Ausnahme werfen es zurück an den client. Ich hoffe nur, es geht nicht weiter, bis die Exception unterdrückt.
  • Mit Sicherheits-Modul-Klasse meinte ich DatabaseServerLoginModule
  • Danke, aber ich Frage mich, warum LoginContext nicht funktioniert. Es ist veraltet JBossAS 7?
  • Hast du eine Antwort über den LoginContext ? Ich versuche zu migrieren ähnlichen code von JBoss 5 nach JBoss 7. Danke.
  • Leider Nein. Dies ist der einzige Grund für die Verwendung der älteren version von JBoss für mich. 🙁

InformationsquelleAutor fpu | 2012-05-04
Schreibe einen Kommentar