4

我需要在身份验证后从 LDAP 中检索各种值,例如 Description、Office 等。

我已经能够完成身份验证,但我无法检索其他值。

我应该使用什么名称来检索完整的数据?

请帮忙。

我的代码如下:

    public boolean authenticate(String userid, String pass, String domain) {
        boolean retval = false;
        String searchFilter ="(&(objectClass=user)(" + LDAP_UID_ATTR + "=" + userid + "))";


        try {
            System.out.println("Start: getLDAPAttrs");
            NamingEnumeration answer =
                getLDAPAttrs(userid, pass, searchFilter, domain);
            String uid = "";

            while (answer.hasMoreElements()) {
                SearchResult sr = (SearchResult)answer.next();

                Attributes attrs = sr.getAttributes();

                try {
                    uid = attrs.get(LDAP_UID_ATTR).toString();
                    System.out.println("uid: " + uid);
                    System.out.println(attrs.get("mail"));
                    uid = uid.substring(uid.indexOf(':') + 2);
                } catch (Exception err) {
//                    uid = "";
                    System.out.println(err.getMessage());
                    err.printStackTrace();
                }

                // verify userid
                if (userid.equalsIgnoreCase(uid)) {
                    retval = true;

                    break;
                }
            }
        } catch (NamingException ne) {
            System.out.println("In authenticateWithLDAP, LDAP Authentication NamingException : " +
                               ne.getMessage());
        } catch (Exception ex) {
            System.out.println("In authenticateWithLDAP, LDAP Authentication Exception : " +
                               ex.getMessage());
        }

        return retval;
        //        return retval;
    }

    private NamingEnumeration getLDAPAttrs(String userid, String pass,
                                           String searchFilter,
                                           String domain) throws NamingException,
                                                                 Exception {
        String host = getServerName();
        String port = getIP_Port();
        String dcPart1 = getDcPart1();
        String dcPart2 = getDcPart2();
//        String attrUserID = getLDAP_UID_ATTR();
//        String attrUserName = getLDAP_UNAME_ATTR();

        // set attribute names to obtain value of
        String[] returnedAtts = { "sAMAccountName", "cn","mail" };
        SearchControls searchCtls = new SearchControls();
        searchCtls.setReturningAttributes(returnedAtts);

        // specify the search scope
        searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);

        // set search base
        String searchBase = "DC=" + dcPart1 + ",DC=" + dcPart2;

        // set ldap env values
        Hashtable environment = new Hashtable();
        environment.put(Context.INITIAL_CONTEXT_FACTORY,
                        "com.sun.jndi.ldap.LdapCtxFactory");
        environment.put(Context.PROVIDER_URL, "ldap://" + host + ":" + port);
        environment.put(Context.SECURITY_AUTHENTICATION, "simple");
        environment.put(Context.SECURITY_PRINCIPAL, userid + "@" + domain);
        environment.put(Context.SECURITY_CREDENTIALS, pass);

        // set ldap context
        DirContext ctxGC = new InitialDirContext(environment);

        // perform search to obtain values
        NamingEnumeration answer =
            ctxGC.search(searchBase, searchFilter, searchCtls);
        return answer;
    }
4

2 回答 2

3

LDAP 客户端通过将搜索请求传输到服务器然后读取服务器的响应来检索属性值(在问题中称为“字段”)。搜索请求至少包含以下组件:

  • 基本 DN - 开始搜索的对象。不返回高于基本 DN 的对象
  • scope - 搜索范围;这是base, one, 或subtree
  • filter - 限制服务器返回的条目的过滤器

此外,请求的属性列表可以与搜索请求一起传输。如果未提供请求的属性列表,许多 LDAP SDK 将仅返回所有用户属性而不返回操作属性。在这种情况下,请求属性description以及office所需的任何其他内容。

符合 LDAP 的服务器强制实施可能导致服务器不返回某些属性的访问控制方案。请咨询 LDAP 管理员以确定 LDAP 客户端连接的身份验证状态是否有权访问所需的属性。

也可以看看

于 2012-07-05T10:01:07.303 回答
0

我发现出了什么问题。

我必须在返回的属性中包含参数:

String[] returnedAtts = { "sAMAccountName", "cn","mail" };

或者

String[] returnedAtts = { "sAMAccountName", "cn","mail","description" };

然后在获取属性时使用它的值。

谢谢

于 2012-07-06T12:25:28.773 回答