Нежелательное уведомление LDAP с использованием spring

Извините, если я не понимаю точных фраз, я новичок в этой области...

Я использую Spring LDAP для аутентификации/проверки пользователей. Я хочу иметь возможность получать уведомления от LDAP после внесения изменений, таких как удаление или обновление пользователей.

Я знаю, что у меня может быть что-то вроде запланированного задания, которое будет запускаться и проверять конкретных пользователей или группы, которые меня интересуют, но я ищу что-то, что дает мне незапрашиваемые уведомления.

Я поискал в Интернете и нашел следующее: http://docs.oracle.com/javase/tutorial/jndi/ldap/unsol.html, и это выглядит многообещающе, но я не понимаю, как его использовать, плюс я не думаю, что Spring действительно его поддерживает, и мне придется используйте классы jndi, как в прикрепленной ссылке.

Кроме того, похоже, что я получу только уведомление об отключении: http://tools.ietf.org/html/rfc4511#section-4.4 это правда?

И, наконец, я использовал пример кода, который нашел, но я не получил никакого уведомления от моего сервера AD, потому что я буду получать уведомление только об отключении, или есть параметр, который мне нужно установить в AD, чтобы включить эти уведомления?

Вот пример кода. Я попробовал несколько DN для поиска и ctx.addNamingListener, но, возможно, у кого-то есть лучшее представление о том, что мне нужно там использовать.

class RegUnsol {
public static void main(String[] args) {

    // Set up environment for creating initial context
    Hashtable<String, Object> env = new Hashtable<String, Object>(11);
    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
    env.put(Context.PROVIDER_URL, "ldap://MY_AD_IP");

    env.put(Context.SECURITY_AUTHENTICATION, "simple");
    env.put(Context.SECURITY_PRINCIPAL,
            "CN=Administrator,CN=Users,DC=sanity,DC=local");
    env.put(Context.SECURITY_CREDENTIALS, "SOME_PASSWORD");

    try {
        // Get event context for registering listener
        EventContext ctx = new InitialContext(env)
                .lookup("CN=Users,DC=sanity,DC=local");

        // Create listener
        NamingListener listener = new UnsolListener();

        // Register listener with context (all targets equivalent)
        ctx.addNamingListener("CN=Users,DC=sanity,DC=local",
                EventContext.ONELEVEL_SCOPE, listener);

        // Wait 1 minutes for listener to receive events
        try {
            for (int i = 0; i < 5; i++) {
                Thread.sleep(60000);
            }
        } catch (InterruptedException e) {
            System.out.println("sleep interrupted");
        }

        // Not strictly necessary if we're going to close context anyhow
        ctx.removeNamingListener(listener);

        // Close context when we're done
        ctx.close();

    } catch (NamingException e) {
        e.printStackTrace();
    }
}

/**
 * A sample UnsolicitedNotificationListener.
 */
static class UnsolListener implements UnsolicitedNotificationListener {
    @Override
    public void notificationReceived(UnsolicitedNotificationEvent evt) {
        System.out.println("received: " + evt);
    }

    @Override
    public void namingExceptionThrown(NamingExceptionEvent evt) {
        System.out.println(">>> UnsolListener got an exception");
        evt.getException().printStackTrace();
    }
}

}


person jasmine100    schedule 24.09.2013    source источник
comment
Я считаю, что AD довольно нестандартна, когда дело доходит до LDAP, так что это может быть источником проблем. Из ietf.org/rfc/rfc2251.txt определенно следует, что единственным стандартное уведомление. Вы можете просмотреть элементы управления постоянным поиском и уведомлением об изменении записи в unboundid.com/products/ldap-sdk/docs/getting-started/   -  person Will    schedule 24.09.2013
comment
Когда вы обновляете пользователя, изменяете LDAP, вы получаете успешный ответ. Что еще вы ищете? Все изменения? Посмотрите на элемент управления DirSync. (msdn.microsoft.com/ en-us/library/windows/desktop/)   -  person jwilleke    schedule 25.09.2013
comment
@jeemster Я не буду обновлять пользователей, я хочу знать, обновляет ли кто-то или удаляет пользователей или группы на самом сервере LDAP.   -  person jasmine100    schedule 26.09.2013
comment
Спасибо всем за ответы. Как я уже сказал, я не собираюсь использовать UnboundID, но попробую использовать постоянный поиск.   -  person jasmine100    schedule 03.10.2013


Ответы (3)


Незапрашиваемое уведомление вам не поможет. (AFAIK, единственное уведомление, которое реализует любой сервер, - это уведомление об отключении)

Вы можете реализовать постоянный поиск, если вам нужна информация в режиме реального времени.

Или вы можете периодически запрашивать информацию о том, кто и кем был изменен.

При любом методе вы должны посмотреть на createdTimeStamp и modifierName.

Я нашел реализация JNDI.

person jwilleke    schedule 26.09.2013

Просто добавьте JNDI NamingListener. Пример кода для этого предоставлен в пакете документация для javax.naming.event.

person user207421    schedule 27.09.2013
comment
пример кода не работает. это имеет ту же проблему, что и я. - person jasmine100; 09.10.2013

UnsolicitedNotification отправляется серверами подключенным клиентам, когда происходит событие, требующее уведомления клиентов, например, клиент будет отключен.

Вашему клиенту требуется уведомление об изменении. Уведомление об изменении зависит от используемого сервера. Многие серверы профессионального качества поддерживают постоянный поиск для этой цели. Ссылка описывает постоянный поиск и предоставляет полный пример его использования с использованием UnboundID LDAP SDK.

Кроме того, многие серверы поддерживают понятие change log. Устаревший сервер Sun DSEE поддерживает это понятие по имени файла retro change log. сервер каталогов UnboundID также поддерживает изменение log (а также уведомления об изменениях другими способами).

person Terry Gardner    schedule 03.10.2013