[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)
转换。
当我尝试从 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)
转换。