2013-02-14 96 views
-1

使用以下代码,我可以使用本地LDAP服务器将用户testu与密码testp绑定/验证。在我的DIT中,这个用户也属于一个组,比如Administrators。我怎样才能得到他所属的小组的名称,反之亦然,请检查该用户是否属于该小组?验证LDAP用户并检查它们是否属于组

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] 

如何将我从这个用户拿到小组第一?

回答

1

如果您进行了绑定,那么您知道用户的DN,你可以做这样一个搜索请求:

库搜索DN:OU =系统

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

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

+0

如何检查该权限?它可能不同于LDAP服务器到LDAP服务器。我使用的是Apache Directory Studio,我几乎可以浏览所有内容。 – 2013-02-15 14:20:08

+0

又是什么意思由DIRECT会员?因为使用范围“子树”,您发布的查询不会返回任何内容。 – 2013-02-15 14:28:11

+0

“直接”成员是一个组的正常成员,而另一个成员是另一个组的成员。一些LDAP实现可以将一个组作为另一个组的成员。我假设,您使用的用户没有适当的权限,或者您在所有错误的地方寻找组。 – jwilleke 2013-02-16 18:25:05

0

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

如果要检查用户是否在某个组中,或者通常发送任何不应该从某个用户刚刚登录(或未登录)的有限观点看世界的查询,那么我会创建ldap上的单独用户(该应用程序的“应用程序连接”用户),然后通过连接到该用户来提交查询。 (这与大多数SQL Server类似,您可以使用DB Admin帐户完成所有工作,但如果您有应用程序,则不会使用管理员帐户连接到数据库,但会为该应用程序创建一个特殊用户读取和写入它需要的数据库/表)。

这是最有可能的解决方案,你已经想到你自己了,所以这篇文章的实际“答案”部分是据我所知没有其他方式。

+0

我希望能够避免将系统管理员用户信息放入我的应用程序中。 – 2013-02-14 20:22:27

+0

是的,这就是为什么我的意思是创建一个单独的“应用程序管理员”,权限仅限于应用程序所需的权限。看来我的答案还不清楚,我应该试着让它更容易理解吗? – 2013-02-14 20:31:20

+0

当然,请做。我还没有真正了解ldap目录模式的完整结构。 – 2013-02-14 20:36:18

相关问题