11

何ヶ月も自分で解決策を見つけることができなかったので、ここに質問を書いています。私の状況:Java2ee6とEJB3.0を使用するJavaで記述されたクライアントサーバーアプリケーションがあります。サーバー側はGlassfish3.0にデプロイされます。アプリケーションのログインモジュールを開発/実装する必要があります。認証はLDAPサーバーを使用して行う必要があり、承認はアプリケーション内で処理されます。したがって、認証と承認を組み合わせるためにJAASテクノロジーを採用したいと思います。たとえば、ここのようにやっています。次に、このチュートリアル公式ドキュメントに従ってログインを実行します。私の問題は、LDAPログインが機能しないことです。

私のコード:

    LoginContext lc = null;

    try {
        CallbackHandler handler = new CallbackHandler() {
            public void handle(Callback[] callbacks) throws UnsupportedCallbackException {
                for( int i = 0; i < callbacks.length; i++ ) {
                    if( callbacks[i] instanceof NameCallback ) {
                        // prompt the user for a username
                          NameCallback nc = (NameCallback)callbacks[i];
                          nc.setName("admin");
                          System.out.println("Login done.");
                    } else if( callbacks[i] instanceof PasswordCallback ) {
                        // prompt the user for sensitive information
                          PasswordCallback pc = (PasswordCallback)callbacks[i];
                          pc.setPassword("mypassword".toCharArray());
                          System.out.println("Password done.");
                    } else {
                        throw new UnsupportedCallbackException(callbacks[i], "Unrecognized Callback");
                    } //end if/else
                } //end for()
            }
        };

        lc = new LoginContext("myAuth", handler);
        lc.login();
        Subject subject = lc.getSubject();
    } catch (LoginException e) {
        e.printStackTrace();
    }

私のJAAS構成ファイル:

myAuth {
com.sun.enterprise.security.auth.login.LDAPLoginModule REQUIRED
userProvider="ldap://mydomain:389/OU=users,DC=my,DC=domain,DC=com"
authIdentity="{USERNAME}"
    useSSL=false
debug=true;
};

アプリケーションのクライアント部分は、次のjvmオプションを使用して実行されます。

-Djava.security.auth.login.config=./jaas.conf  -Dorg.omg.CORBA.ORBInitialHost=localhost

Glassfishサイトで、jvmプロパティを設定しました

-Djava.security.auth.login.config=${com.sun.aas.instanceRoot}/config/login.conf
-Djava.naming.referral=follow

Glassfish側のlogin.confファイルには次の行が含まれています(ADRealmは私のGlassfishのデフォルトのレルムです)

ADRealm {
com.sun.enterprise.security.auth.login.LDAPLoginModule REQUIRED;
};

ADRealmの設定:

      <property name="jaas-context" value="ldapRealm" />
      <property name="base-dn" value="CN=users,DC=my,DC=domain,DC=com" />
      <property name="directory" value="ldap://mydomain:3268" />
      <property name="search-bind-password" value="mypassword" />
      <property name="search-bind-dn" value="admin@my.domain.com" />

少なくともそれが機能することを確認するために、LDAPログインを実行しようとしていることに注意してください。

クライアントを実行すると、次のエラーが発生します。

Mar 1, 2013 1:36:44 PM com.sun.appserv.security.AppservPasswordLoginModule extractCredentials
SEVERE: passwordlm.nopwdcred
javax.security.auth.login.LoginException: No credentials.

一度動作するのは奇妙なことです(!)、つまりメソッドsubjectから取得できます。lc.getSubject()またhandle()、表示されていないため、上記のメソッドは呼び出されないと思います

Login done.
Password done.

出力で。

誰か助けてくれませんか?

4

1 に答える 1