-1

使用以下代码,我可以使用我的本地 LDAP 服务器绑定/验证testu带有密码的用户。testp在我的 DIT 中,这个用户也属于一个组,比如说Administrators。如何获取他所属组的名称,反之亦然检查该用户是否属于该组?

public static void main(String[] args) 
{
    Properties properties = new Properties();
    properties.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory" );
    properties.put(Context.PROVIDER_URL, "ldap://localhost:10389");

    // set properties for authentication
    properties.put(Context.SECURITY_AUTHENTICATION, "simple");
    properties.put(Context.SECURITY_PRINCIPAL, "cn=testu,ou=users,ou=system");
    properties.put(Context.SECURITY_CREDENTIALS, "testp");

    try {
        InitialLdapContext ctx = new InitialLdapContext(properties, null);          
    } catch (NamingException e) {
        e.printStackTrace();
    }
}

在我的 LDAP 浏览器中,在树结构中,我有用户testu

cn=testu,ou=users,ou=system

Administrators小组在

cn=Administrators,ou=groups,ou=system

现在我什至不认为我已经获得了该组中的用户,但假设我做了你会如何寻找它?我基本上是在询问如何通过 LDAP 相对于经过身份验证的用户进行搜索查询。

给定以下组:

cn=operations,ou=groups,ou=system
objectClass:groupOfNames (structural)
objectClass:top (abstract)
cn:operations
member:cn=soto,ou=users,ou=system
member:cn=testu,ou=users,ou=system

而这个用户:

cn=testu,ou=users,ou=system
objectClass:organizationalPerson (structural)
objectClass:person (structural)
objectClass:top (abstract)
cn:testu
sn:some name
userPassword:SHA hashed password    [testp]

我将如何从该用户那里获得组?

4

2 回答 2

1

如果您执行了绑定,那么您知道用户的 DN,您可以执行如下搜索请求:

基础搜索 DN:ou=system

(member=cn=testu,ou=users,ou=system)

如果您有权限,这将返回用户是 DIRECT 成员的所有组。它不包括任何嵌套的组成员身份。

于 2013-02-15T12:20:24.537 回答
0

据我所知,LDAP 不会将有关当前登录的用户的任何组信息附加到上下文中。您只能通过哪些行为有效和哪些无效行为来间接了解他/她的权力 - 确保您不打算那样做。

如果要检查用户是否在某个组中,或者通常要发送任何不应该从刚刚登录(或未登录)的用户的有限角度查看世界的查询,我会在ldap(该应用程序的“应用程序连接”用户),然后通过连接到该用户来提交查询。(这与大多数 SQL Server 类似,您拥有可以执行所有操作的 DB Admin 帐户,但是如果您有一个应用程序,您不会使用 Admin 帐户连接到 DB,而是为该应用程序创建一个特殊用户,该用户只能读写它需要的数据库/表)。

这很可能是您已经想到的解决方案,所以这篇文章的实际“答案”部分是据我所知没有其他方法。

于 2013-02-14T20:18:27.213 回答