Пытаюсь работать с помощью Spring с LDAP-сервером, получается получить список объектов, получает найти один объект, не получается добавить. Вот класс:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
package com.tfnetwork.admin.user.dao.ldap;
import com.tfnetwork.admin.user.dao.IUserDAO;
import com.tfnetwork.admin.user.User;
import java.util.List;
import java.util.HashMap;
import java.util.Set;
import org.springframework.ldap.LdapTemplate;
import org.springframework.ldap.ContextMapper;
import org.springframework.ldap.EntryNotFoundException;
import org.springframework.ldap.support.DirContextAdapter;
import org.springframework.ldap.support.DistinguishedName;
import org.springframework.ldap.support.filter.EqualsFilter;
import org.springframework.ldap.support.filter.AndFilter;
import javax.naming.Name;
import javax.naming.InvalidNameException;
public class LDAPUserDAO implements IUserDAO {
public static final String LDAP_CLASS = "inetOrgPerson";
private LdapTemplate template;
private UserContextMapper mapper;
public void setLdapTemplate(LdapTemplate template) {
this .template = template;
}
public void setContextMapper(ContextMapper mapper) {
this .mapper = (UserContextMapper) mapper;
}
public void create(User user) {
user.setId(user.getFirstName());
DirContextAdapter context = new DirContextAdapter();
mapper.mapToContext(user, context);
try {
Name dn = buildDN(user);
template.bind(dn, context, null );
} catch (Exception e) {
System.out.println("Binding error: "+e.getMessage());
}
}
public void update(User user) {
template.rebind(buildDN(user), null , mapper.buildAttributes(user));
}
public User load(Object id) {
User result = null ;
try {
result = (User) template.lookup(buildDN(id), mapper);
System.out.println("Loaded User id="+id);
} catch (EntryNotFoundException nfe) {
System.out.println("User with CN=" + id + " is not found.");
}
return result;
}
public List find(HashMap criteria) {
AndFilter filter = new AndFilter();
filter.and( new EqualsFilter("objectclass", LDAP_CLASS));
Set<String> filterSet = criteria.keySet();
for (String key : filterSet) {
String value = (String) criteria.get(key);
if (value != null && !value.trim().equals("")) {
filter.and( new EqualsFilter(key, value));
}
}
return template.search(DistinguishedName.EMPTY_PATH, filter.encode(), mapper);
}
protected Name buildDN(User user) {
return buildDN(user.getId());
}
protected Name buildDN(Object id) {
DistinguishedName dn = new DistinguishedName();
dn.add("cn", (String) id);
return dn;
}
}
Выводит ошибку:
javax.naming.NameNotFoundException: [LDAP: error code 32 - Родительская запись не найдена в иерархии.]; remaining name 'cn=Test'
Если же последнюю процедуру переделать следующим образом:
1.
2.
3.
4.
protected Name buildDN(Object id) {
DistinguishedName dn = new DistinguishedName(BASE_DN);
dn.add("cn", (String) id);
return dn;
}
Где BASE_DN это базовы DN подключения, в частности:
cn=Users,dc=companyname,dc=companydomen
С данным DN в стороннем приложении по управлению LDAP объект создается, класс же возвращает:
javax.naming.NameNotFoundException: [LDAP: error code 32 - Родительская запись не найдена в иерархии.]; remaining name 'cn=hh, cn=Users, dc=softclub, dc=scx'
Помогите пожалуйста разобраться