Запрос LDAP, чтобы проверить, существует ли пользователь в группе или подгруппе

Я аутентифицирую пользователей на сервере 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

  • User1
  • Пользователь2
  • SubGroup1

    -User3

    -User4

  • SubGroup2

    -User5

Group2

  • User6
  • User7

Пользователь 1-5 должен иметь возможность войти в систему, но пользователь 6 и пользователь 7 не должны иметь возможность войти.

1 ответ

Решение

Я предполагаю, что, когда вы показываете поиск "ObjectSid", вы используете Microsoft Active Directory. Если это так, Вы можете использовать расширяемый фильтр соответствия, используя LDAP_MATCHING_RULE_IN_CHAIN. Запросите группу с областью действия =BASE и что-то вроде:

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

Должно сработать.

Дополнительные примеры доступны.

Другие вопросы по тегам