如何保证名称是有效的Active Directory用户?

时间:2017-08-30 15:33:57

标签: java active-directory ldap

目标是在给定用户ID列表的情况下,使用Java中的LDAP从AD(活动目录)中提取不同的属性。为此,我有

public Map<String, List<String>> UserDetails(List<String> userSAMs){
    DirContext ldapContext = null;
    Map<String, List<String>> detailsMap = null;
    ldapContext = new LdapProp().getLdapContext();
    String returnedAtts[] = {"cn", "givenName", "memberOf"};

    String searchFilter = "(&(objectClass=user)(|"; // long OR statement
    for (String sam : listSamids){ // building the LDAP query 
       // HIC SUNT LEONES
       searchFilter = "(" + sam + ")";
    }
    searchFilter = searchFilter + "))";

    NamingEnumeration<SearchResult> answer = ldapContext.search(searchBase, searchFilter, searchCtls);
    while (answer.hasMoreElements()) {  // Loop over results
        SearchResult sr = (SearchResult) answer.next();
            Attributes attrs = sr.getAttributes();
            String samStr= attrs.get("sAMAccountName").toString();
            samStr.replace("sAMAccountName: ", "");
            List<String> propOfSam = new ArrayList();
            for (String ldapParam : returnedAtts){
                String paramStr = attrs.get(ldapParam).toString();
                paramStr.replace(ldapParam + ": ", ""); // extract value
                propertiesOfSam.add(paramStr);
            }
            detailsMap.put(samStrng,propertiesOfSam);
        };
   return detailsMap;
 }

为简单起见,我删除了代码中的所有错误处理。类LdapProp封装了所有LDAP连接详细信息,例如AD服务器的PROVIDER_URLSECURITY_PRINCIPALSECURITY_CREDENTIALSSEARCH_BASE

我的问题:如何保证输入列表的完整性?该位置在代码中以HIC SUNT LEONES标记。

RFC 1779RFC 2253中描述了允许的字符列表。

1 个答案:

答案 0 :(得分:0)

到目前为止,我尝试过的一件事是使用正则表达式从输入列表的每个字符串sam中删除所有禁用的字符。非平凡的部分是如何正确地逃脱它们。我提出了以下解决方法:我用

替换了行\\ HIC SUNT LEONES
sam = sam.replaceAll("[\\\\<>=\\*+-;:\\|@\"\\[\\]\\?]" ,""));

此处,正方括号中的外方括号为字符类,即[abc]表示“a,b或c中的任何字符”。棘手的部分是例如\\\\只代表反斜杠。