使用spring的LDAP未经请求的通知

时间:2013-09-24 15:21:27

标签: java spring security ldap spring-ldap

很抱歉,如果我没有在这里得到确切的短语,我对这个领域很新......

我正在使用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中设置一个设置启用这些通知?

以下是示例代码。我为查找和ctx.addNamingListener尝试了几个DN,但也许有人对我需要在那里使用的内容有更好的了解。

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();
    }
}

}

3 个答案:

答案 0 :(得分:0)

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

如果您需要实时信息,可以实施persistent search

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

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

我找到了JNDI implementation

答案 1 :(得分:0)

只需添加JNDI NamingListener即可。该示例代码在package documentation for javax.naming.event

中提供

答案 2 :(得分:0)

当发生需要通知客户端的事件时,服务器将UnsolicitedNotification发送到连接的客户端,例如,客户端将断开连接。

您的客户需要更改通知。更改通知取决于正在使用的服务器。许多专业品质的服务器为此目的支持 persistent search 。该链接描述了持久性搜索,并使用 UnboundID LDAP SDK 提供了其使用的完整示例。

或者,许多服务器支持change log的概念。旧版Sun DSEE服务器通过retro change log的名称支持此概念。 UnboundID Directory Server 还支持更改日志(以及通过其他方式更改通知)。