2017-05-31 92 views
2

我用彈簧LDAP而我得到這個異常:彈簧LDAP的NameNotFoundException沒有這樣的對象

服務器未知異常:[LDAP: error code 32 - No Such Object]; 
nested exception is javax.naming.NameNotFoundException: 
[LDAP: error code 32 - No Such Object]; remaining name 'uid=lyh,ou=Users,dc=xinsight,dc=com' 

1.my配置

<bean id="ldapTemplate" class="org.springframework.ldap.core.LdapTemplate"> 
    <constructor-arg ref="contextSource"/> 
</bean> 

<bean id="contextSource" 
     class="org.springframework.ldap.core.support.LdapContextSource"> 
    <property name="url" value="ldap://168.2.8.77:389" /> 
    <property name="base" value="dc=xinsight,dc=com" /> 
    <property name="userDn" value="cn=Manager,dc=xinsight,dc=com" /> 
    <property name="password" value="psw" /> 
    <!--<property name="referral" value="follow"/>--> 
</bean> 

2.my代碼

public void create() { 
    User user = new User(); 
    user.setFdUsername("lyhtest"); 
    user.setFdTenantName("root"); 
    user.setFdLdapPassword("ldappsw"); 
    user.setFdUserid(Long.valueOf(10)); 

    Name dn = buildDn(user); 
    ldapTemplate.bind(dn, null, buildAttributes(user)); 
} 

/** 
* 動態創建DN 
* spring-ldap提供了:LdapNameBuilder,LdapUtils 
*/ 
private Name buildDn(User user) { 
    return LdapNameBuilder.newInstance(BASE_DN) 
      .add("ou", "Users") 
      .build(); 
} 

/** 
* 配置屬性 
* @param user 
* @return 
*/ 
private Attributes buildAttributes(User user) { 
    Attributes attrs = new BasicAttributes(); 

    BasicAttribute objectclass = new BasicAttribute("objectclass"); 
    objectclass.add("top"); 
    objectclass.add("posixAccount"); 
    objectclass.add("inetOrgPerson"); 
    attrs.put(objectclass); 

    attrs.put("userPassword", user.getFdLdapPassword()); 
    attrs.put("cn",user.getFdUsername()+"@"+user.getFdTenantName()); 
    attrs.put("sn",user.getFdUsername()+"@"+user.getFdTenantName()); 
    attrs.put("displayName",user.getFdUsername()+"@"+user.getFdTenantName()); 
    attrs.put("homeDirectory","/root"); 
    attrs.put("uidNumber",user.getFdUserid().toString()); 
    attrs.put("uid",user.getFdUsername()); 
    attrs.put("gidNumber","0"); 

    return attrs; 
} 

3.ldap admin ldap admin

4.我也編寫了查詢方法,我可以從ldap獲取用戶信息。所以連接就OK了。

感謝您的幫助!

回答

1

我已經解決了這個問題。

1.I檢查LDAP管理的日誌文件,我看到了 「DN」:

ou=Users,dc=xinsight,dc=com,dc=xinsight,dc=com 

2.before後

return LdapNameBuilder.newInstance(Base_DN) 
      .add("ou", "Users") 
      .add("uid","lyh3") 
      .build(); 

return LdapNameBuilder.newInstance() 
      .add("ou", "Users") 
      .add("uid","lyh3") 
      .build(); 

後,我取出帕拉姆:Base_DN ,我成功創建了一個用戶。然後我檢查LDAP管理的日誌文件,它表明:

dn: ou=Users,dc=xinsight,dc=com 

雖然我不知道爲什麼DN值有重複'DC = xinsight,DC = com公司。我從官方文檔spring-ldap official doc中複製出來,它表明在構建'dn'時需要'base_dn':

protected Name buildDn(Person p) { 
    return LdapNameBuilder.newInstance(BASE_DN) 
    .add("c", p.getCountry()) 
    .add("ou", p.getCompany()) 
    .add("cn", p.getFullname()) 
    .build(); 
}