2016-06-02 2 views
-2

Когда я пытаюсь найти пароль пользователя с сервера LDAP этот ниже ошибки отображается[B не может быть приведен к java.lang.String в LDAP Поиск

В этом коде его не возвращает пользователя Пароль в строки , Он бросает

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

+0

Кажется, пароль пользователя хранится как 'byte []'. Вы должны каким-то образом преобразовать это в String. Может быть, 'new String (байты,« UTF-8 »)'. – Thilo

+0

Или вы просто смотрите на неправильный атрибут. Разве вы не хотите '' userName''? – Thilo

+0

нет я ищу пароль пользователя не имя пользователя, атрибут правильный – Sagar

ответ

-1

Для получения бинарных атрибутов требуется суффикс ;binary, например userCertificate;binary. Тогда у вас есть объект Attribute. Вызов

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

и все готово. Не работайте с toString() или (String) литой.

+0

'; binary' вызывает атрибуты' String', которые будут возвращены как 'byte []'. Этот уже двоичный. – EJP

+0

@EJP Ответ отредактирован. –

+0

Все еще неправильно. Значение уже является байтом [] ', даже без'; binary', и он не использует 'toString()'. – EJP

0

LDAP пароли хранятся хэши, а не строк. Значение атрибута возвращается как byte[], как указано в исключении.

Однако у вас нет веских оснований для получения атрибута хэшированного пароля. Это не принесет вам пользы. Проверьте свое требование. Вы должны быть обязательными, поскольку пользователь использует старый пароль для проверки того, является ли он действительным, а не пытается прочитать пароль, который вы не получите.

+0

Спасибо большое ошибка решена – Sagar

Смежные вопросы