[B不能在LDAP搜索中强制转换为java.lang.String

时间:2016-06-02 06:02:53

标签: java ldap jndi

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

在此代码中,它不会在String中返回用户密码。它抛出

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();
        }
    }

2 个答案:

答案 0 :(得分:0)

LDAP密码存储为哈希值,而不是字符串。除了byte[]之外,属性值将返回 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btnClose_Click(object sender, EventArgs e) { Form2 f2 = new Form2(this); f2.ShowDialog(); } } }

但是,您没有任何充分的理由首先获得哈希密码属性。它对你没有任何好处。检查您的要求。您应该使用旧密码作为用户进行绑定,以测试它是否有效,而不是尝试读取密码,这是您无法获得的。

答案 1 :(得分:-1)

重新获取二进制属性需要hostname后缀,例如;binary。然后你有userCertificate;binary对象。调用

Attribute

你完成了。不要与byte[] bytes = (byte[]) attr.get() toString()演员合作。