2010-12-01 10 views
3

에 암호가있는 사용자를 추가하는 것은 StackOverflow에서 처음입니다. 여기에서 몇 가지 답변을 얻으시기 바랍니다. Windows Active Directory 2008을 사용하여 spring-ldap API를 사용하여 Java에서 새 사용자를 저장하고 있습니다.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(); 
} 

그러나 그것은 나에게 내가 AD에서 사용자 암호를 설정하는 방법 내가 모르는 에러 코드 (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 

을 부여. 우리가 SSL을 필요로한다면 unicodePwd를 설정할 위치를 읽습니다. 이 문제를 해결할 수있는 대안이 있습니까?

+0

이것을 테스트하는 동안 "유니 코드"인코딩과 BOM 제거 대신 "UTF-16LE"를 인코딩으로 사용할 수 있다는 것을 알았습니다. ('' '+ password +' " ') .getBytes ("UTF-16LE "). –

답변

0

당신은 'unicodePassword'에 대해 이야기하지만 코드는 'unicodepwd'를 설정합니다. 무엇 이니?

+0

오, 유감스럽게 생각합니다. EJP 이것은 단지 "unicodePwd"속성입니다 ... –

+0

글쎄 지금까지 3 가지 다른 방법으로 설명했습니다. 코드에서 올바른 것을 사용하는 것이 좋습니다. – EJP

+0

나는 당신이 뭐라고하는지 이해하지 못한다. 더 설명 할 수 있겠 니? –

2

예, WILL_NOT_PERFORM 오류는 SSL 연결을 사용하여 암호를 설정해야한다고 알립니다. (이하 "LDAPS를"주의) ldaps://your.ldap.server:636 :


당신과 같은 URL을 사용할 필요가 SSL 연결을 확인하십시오. 인증서 검증 오류가 발생하면 "keytool"을 사용하여 AD 서버 인증서를 Java 키 저장소로 가져와 Java 응용 프로그램이 인증서를 유효한 것으로 인식해야합니다.

+0

ok David 님은 Ldap에서 SSL을 어떻게 사용할 수 있는지 알고 계실 수 있습니다. Ldap을 사용하는 SSL에 대해 전혀 모르는 완전한 가이드를 보여 주실 수 있습니까? 그저 내가이 문제를 해결할 수있는 모든 Windows 서비스와 SSL 로직을 구현하지 않도록 사용자 비밀번호를 설정하고 싶습니다. –

+0

답장을 보내 주셔서 감사합니다. 글쎄 SSL과 AD의 URL과 포트는 무엇인지 압니다. AD 서버에서 인증서를 가져 오기가 혼란 스럽습니다. 매우 유감스럽게 생각합니다.이 인증서를 얻을 수있는 절차와이 프로세스에 대한 인증서가 얼마나 많은지를 나에게 말할 수 있습니까? –

+0

그 자체로 주제입니다. 여기에 다른 응용 프로그램 ("군중")을 사용하여 수행하는 방법에 대한 지침이 있습니다. http://confluence.atlassian.com/display/CROWD/Configuring+an+SSL+Certificate+for+Microsoft+Active+Directory - not Spring-LDAP에 고유하지만 기본 원칙은 동일합니다 : AD 서버에서 인증서 가져 오기, 'keytool'을 사용하여 자바 키 저장소로 가져 오기 –

관련 문제