2010-12-01 2 views
3

это мой первый раз на StackOverflow, надеюсь, что я получу здесь несколько ответов. Я использую Windows Active Directory 2008 для хранения нового пользователя из java с помощью spring-ldap apiДобавление пользователя с паролем в Active Directory LDAP

Моя проблема заключается в том, что я не могу добавить пользователя с паролем. Я где-то читал, что в AD для установки пароля я должен использовать атрибут unicodePwd. Источник: http://geekswithblogs.net/lance/archive/2005/08/19/LdapAuthenticationASP.aspx

public void insertContact(ContactDTO contactDTO) { 
    try{ 

    Attributes personAttributes = new BasicAttributes(); 
    BasicAttribute personBasicAttribute = new BasicAttribute("objectclass"); 
    personBasicAttribute.add("person"); 
    personBasicAttribute.add("user"); 
    personAttributes.put(personBasicAttribute); 

     personAttributes.put("givenName", contactDTO.getCommonName()); 
     personAttributes.put("cn", contactDTO.getCommonName()); 
     personAttributes.put("sn", contactDTO.getLastName()); 
     personAttributes.put("description", contactDTO.getDescription()); 

     personAttributes.put("unicodePwd", 
      this.createUnicodePassword(contactDTO.getPassword())); 
     personAttributes.put("userPrincipalName", contactDTO.getUserLoginName()); 
     personAttributes.put("sAMAccountName", contactDTO.getsAMAccountName()); 
     personAttributes.put("displayname", contactDTO.getDisplayname()); 
     // personAttributes.put("pwdLastSet", "0"); 
     // personAttributes.put("LockOutTime", "0"); 

     personAttributes.put("userAccountControl", "544"); 

     BasicAttribute roomAttribute = new BasicAttribute("roomNumber"); 
     for(String r : contactDTO.getRoomNumber()) 
     { 
     roomAttribute.add(r); 
     } 

     personAttributes.put(roomAttribute); 


     DistinguishedName newContactDN = new DistinguishedName(); 
     newContactDN.add("cn", contactDTO.getCommonName()); 

     ldapTemplate.bind(newContactDN, null, personAttributes); 
    } 

public byte[] createUnicodePassword(String password){ 
    return toUnicodeBytes(doubleQuoteString(password)); 
} 

private byte[] toUnicodeBytes(String str){ 
    byte[] unicodeBytes = null; 
    try{ 
     byte[] unicodeBytesWithQuotes = str.getBytes("Unicode"); 
     unicodeBytes = new byte[unicodeBytesWithQuotes.length - 2]; 
     System.arraycopy(unicodeBytesWithQuotes, 2, unicodeBytes, 0, 
      unicodeBytesWithQuotes.length - 2); 
    } catch(UnsupportedEncodingException e){ 
     // This should never happen. 
     e.printStackTrace(); 
    } 
    return unicodeBytes; 
} 

private String doubleQuoteString(String str){ 
    StringBuffer sb = new StringBuffer(); 
    sb.append("\""); 
    sb.append(str); 
    sb.append("\""); 
    return sb.toString(); 
} 

но дал мне код ошибки 53

enter code here: org.springframework.ldap.UncategorizedLdapException: Operation failed; nested exception is javax.naming.OperationNotSupportedException: [LDAP: error code 53 - 0000001F: SvcErr: DSID-031A11E5, problem 5003 (WILL_NOT_PERFORM), data 0 

я не знаю, как я установить пароль пользователя в AD. Я также прочитал, где установить unicodePwd, нам нужен SSL, если это необходимо, как я могу это сделать. есть ли альтернатива для решения этой проблемы, пожалуйста, помогите мне

+0

Проверяя это, я обнаружил, что вместо использования кодировки и удаления Unicode спецификации, вы можете просто использовать «UTF-16LE» в качестве кодировки, например. ('' '+ password +' '') .getBytes («UTF-16LE»). – 2013-09-13 14:56:30

ответ

0

Вы говорите о «unicodePassword», но ваши кодовые наборы «unicodepwd». Что он?

+0

ohh sorry EJP это просто атрибут «unicodePwd» ... – 2010-12-01 08:49:01

+0

Ну, это три разных способа, которыми вы его пишете до сих пор. Я предлагаю вам использовать правильный код в своем коде, в зависимости от того, что это. – EJP 2010-12-01 10:21:10

2

Да, ошибка WILL_NOT_PERFORM - это AD, указывающая, что вам нужно использовать SSL-соединение для установки пароля.


Чтобы установить соединение SSL, необходимо использовать URL-адрес, который выглядит так: ldaps://your.ldap.server:636 (обратите внимание на "LDAPS"). Если вы получите ошибку проверки сертификата, вам нужно будет использовать «keytool» для импорта сертификата сервера AD в хранилище ключей Java, поэтому ваше приложение Java признает сертификат действительным.

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