[B 无法在 LDAP 搜索中转换为 java.lang.String

[B cannot be cast to java.lang.String in LDAP Search

当我尝试从 ldap 服务器搜索用户密码时 显示以下错误

在此代码中,return 用户密码不在字符串中。它抛出

java.lang.ClassCastException: [B cannot be cast to java.lang.String 

代码:

public class selectEntry {

        DirContext ldapContext = null;

        public selectEntry() {
            try {
                Hashtable<String, String> environment = new Hashtable<String, String>();

                environment.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
                environment.put(Context.PROVIDER_URL, url);
                environment.put(Context.SECURITY_AUTHENTICATION, conntype);
                environment.put(Context.SECURITY_PRINCIPAL, AdminDn);
                environment.put(Context.SECURITY_CREDENTIALS, password);

                ldapContext = new InitialDirContext(environment);

                System.out.println("Bind successful");
            } catch (Exception exception) {
                exception.printStackTrace();
            }
        }

        public void getEntry() {
            try {
                SearchControls searcCon = new SearchControls();
                searcCon.setSearchScope(SearchControls.SUBTREE_SCOPE);
                NamingEnumeration results
                        = ldapContext.search("uid=aruhat.aruhat,ou=openzki,dc=aruhat,dc=co,dc=in", "(uid=aruhat.aruhat)", searcCon);
                if (results != null) {
                    while (results.hasMore()) {
                        SearchResult res = (SearchResult) results.next();
                        Attributes atbs = res.getAttributes();
                        Attribute atb = atbs.get("userPassword");
                        String name = (String) atb.get();
                       System.out.println("Name is :=> " + name);
                    }
                } else {
                    System.out.println("fail");
                }
            } catch (Exception e) {
                System.out.println("Exception Type:=> "+e);
                System.out.println("Exception Message:=> "+e.getMessage());
                e.printStackTrace();
            }
        }

        public static void main(String[] args) {
            new selectEntry().getEntry();
        }
    }

LDAP 密码存储为散列,而不是字符串。如异常所述,属性值作为 byte[] 返回。

但是,您一开始就没有任何充分的理由来获取散列密码属性。这对你没有任何好处。查看您的要求。您应该绑定为使用旧密码的用户来测试它是否有效,而不是尝试读取您不会得到的密码。

检索二进制属性需要 ;binary 后缀,例如 userCertificate;binary。然后你有 Attribute 对象。调用

byte[] bytes = (byte[]) attr.get()

大功告成。不要使用 toString()(String) 转换。