2

对不起,如果我在这里没有得到确切的短语,我对这个领域很陌生......

我正在使用 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();
    }
}

}

4

3 回答 3

0

只需添加一个 JNDI NamingListener。javax.naming.event 的包文档中提供了示例代码。

于 2013-09-27T00:28:27.797 回答
0

The UnsolicitedNotification is sent by servers to connected clients when an event transpires that requires clients to be notified, for example, the client is going to be disconnected.

Your client requires change notification. A change notification is dependent on the server in use. Many professional-quality servers support the persistent search for this purpose. The link describes the persistent search and provides a complete example of its use using the UnboundID LDAP SDK.

Alternatively, many servers support the notion of a change log. The legacy Sun DSEE server supports this notion by the name of the retro change log. The UnboundID Directory Server also supports a change log (as well as change notifications by other means).

于 2013-10-03T12:33:28.253 回答
0

不请自来的通知对您没有帮助。(AFAIK,任何服务器实现的唯一通知是断开连接通知)

如果您需要实时信息,您可以实施持久搜索。

或者,您可以定期查询以查看谁更改了更改以及由谁更改。

无论哪种方法,您都会查看 modifiedTimeStamp 和 modifierName。

我找到了一个JNDI 实现

于 2013-09-26T21:58:01.307 回答