验证LDAP用户并检查它们是否属于某个组

时间:2013-02-14 16:38:57

标签: java ldap

使用以下代码,我可以使用我的本地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]

我如何从该用户获得该组?

2 个答案:

答案 0 :(得分:1)

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

基本搜索DN:ou = system

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

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

答案 1 :(得分:0)

据我所知,LDAP没有附加有关当前登录到上下文的用户的任何组信息。你只能通过什么行动起作用而间接发现他/她的能力,而不是那样 - 确定你不打算这样做。

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

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