Конфигурация JAAS и модуль регистрации LDAP в JavaEE 6

Я пишу вопрос здесь, потому что я не мог найти решение сам в течение нескольких месяцев. Моя ситуация: у меня есть клиент-серверное приложение, написанное на Java, которое использует Java2ee 6 и EJB3.0. Серверная сторона развернута на стеклянную рыбку 3.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

На сайте в стеклянной платке я установил свойства jvm

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

Файл login.conf на стороне стеклянной рыбы содержит следующие строки (ADRealm - область по умолчанию моей стеклянной рыбы)

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="[email protected]" />

Я хочу подчеркнуть ваше внимание, что я пытаюсь выполнить 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.

на выходе.

Пожалуйста, кто-нибудь может мне помочь???

Ответ 1

1st. В LDAP вы не используете администратора, но создаете другого пользователя с необходимыми критериями для поиска и/или привязки, если необходимо. Пользователь admin не является безопасным и не рекомендуется, особенно в контексте Java EE.

2nd - С каким сервером LDAP вы пытаетесь подключиться? OpenLDAP или сервер Exchange?

Я ссылаюсь на вас на эти ссылки, ожидая ответа: