对不起,如果我在这里没有得到确切的短语,我对这个领域很陌生......
我正在使用 Spring LDAP 来验证/验证用户。一旦发生诸如删除或更新用户之类的更改,我希望能够从 LDAP 获得通知。
我知道我可以有类似计划任务的东西,它将运行并检查我感兴趣的特定用户或组,但我正在寻找能够给我不请自来的通知的东西。
我在网上查看并发现以下内容: http ://docs.oracle.com/javase/tutorial/jndi/ldap/unsol.html 这看起来很有希望,但我不明白如何使用它,而且我不知道认为 spring 真的支持它,我将不得不使用 jndi 类,就像在附加的链接中一样。
此外,看起来我将收到的唯一通知是断开连接通知:https ://www.rfc-editor.org/rfc/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();
}
}
}