Извините, если я не понимаю точных фраз, я новичок в этой области...
Я использую 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();
}
}
}