【问题标题】:LDAP Query to check if user exists in a group or subgroupLDAP 查询以检查用户是否存在于组或子组中
【发布时间】:2014-04-19 06:52:58
【问题描述】:

我正在根据 LDAP 服务器对用户进行身份验证,我需要查看用户是否属于特定组。属于该组下的子组的所有用户也应该被允许登录。这是我目前正在使用的代码:

    private String[] returnedAtts = { "sn", "givenName", "mail", "objectSid", "memberOf" };
    SearchControls searchCtls = new SearchControls();
    searchCtls.setReturningAttributes(returnedAtts);
    searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
    LdapContext ldatCtxt = null;
    try{
        ldatCtxt= getInitialContext(userName, password);
    }
    catch(AuthenticationException e){           
        throw new AppException(AppMessageHandler.getClientString("invalidCredentials"));
    }
    String searchFilter = userSearchQuery.replace("$USERID$", userName);

    NamingEnumeration<?> answer = ldatCtxt.search(searchBase, searchFilter,searchCtls);
    String userGroup=null;
    if(answer==null || !answer.hasMoreElements()){
        throw new AppLoginException(AppMessageHandler.getClientString("invalidCredentials"));
    }
    SearchResult searchresult = (SearchResult) answer.next();
    Attribute memberOf = (Attribute) searchresult.getAttributes().get("memberOf");
    if(memberOf==null){
        throw new AppLoginException(AppMessageHandler.getClientString("userNotInADGroup"));
    }
    userGroup = (String) memberOf.get();                    
    String[] groups=userGroup.split(",");
    boolean isMemberOfGroup = false;
    for(String groupName:groups)
    {
        if(groupName.equals("CN="+appUserGrp))
            isMemberOfGroup = true;
    }
    if(!isMemberOfGroup){
            throw new AppLoginException(AppMessageHandler.getClientString("userNotInADGroup"));
        }

当我检查特定组时这工作正常,但当来自子组的用户(它是父组的成员 - appUserGrp)时不起作用。有没有办法检查用户是否属于特定组或属于该组成员的任何子组?

这是我拥有的组结构示例:

组 1

  • 用户1
  • 用户2
  • 子组 1

    -用户3

    -用户4

  • 子组2

    -用户5

组2

  • 用户6
  • 用户7

user1-5应该可以登录,但是user6和user7应该不能登录。

【问题讨论】:

  • 您使用的 LDAP 服务器软件是什么?一些实现提供操作属性来检查嵌套组结构中的成员资格。
  • 我正在使用 Microsoft Active Directory。

标签: java authentication ldap ldap-query


【解决方案1】:

我假设当您显示搜索“ObjectSid”时,您正在使用 Microsoft Active Directory。 如果是这样,您可以使用 LDAP_MATCHING_RULE_IN_CHAIN 使用可扩展匹配过滤器。使用 scope=BASE 和类似的东西查询组:

(member:1.2.840.113556.1.4.1941:=CN=John Smith,DC=MyDomain,DC=NET) 

应该可以。

更多examples are available.

【讨论】:

  • 谢谢!让我试试看!
猜你喜欢
  • 1970-01-01
  • 2018-04-23
  • 2020-07-23
  • 2016-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多