2

jboss-app.xml を使用して JBoss AS7 にデプロイされた耳があります。

<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を返すダミーBeanを作成し、ログイン後に呼び出すことを検討していますが、見栄えが悪いです。

PS 私の英語でごめんなさい (少し恥ずかしがり屋です)

4

1 に答える 1

0

ClientLoginModule は現在 AS7 ではサポートされていません。ログイン モジュールが行うのは、ユーザー名とパスワードをスレッド ローカルに関連付けるだけで、実際の認証は実行しません。

InitialContext に関しては、使用しようとすると例外がスローされるはずです。

于 2012-05-29T10:43:16.347 に答える