#java #ldap #jndi
#java #ldap #jndi
Вопрос:
У меня проблема с добавлением записи в LDAP, именно я хочу добавить пользователя.
class AddUser {
public static void main(String[] args) {
String userName = "manager";
String password = "pass";
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://192.168.10.45:389/dc=mydc,dc=local");
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, new String("mydc" "\" userName));
env.put(Context.SECURITY_CREDENTIALS, password);
// env.put(Context.REFERRAL, "follow");
// entry's DN
String entryDN = "cn=NewUser, dc=mydc, dc=local";
// entry's attributes
Attribute cn = new BasicAttribute("cn", "NewUser");
Attribute sn = new BasicAttribute("sn", "Smith");
Attribute mail = new BasicAttribute("mail", "newuser@foo.com");
Attribute phone = new BasicAttribute("telephoneNumber", " 1 222 3334444");
Attribute uid = new BasicAttribute("uid", "nsmith");
Attribute userPassword = new BasicAttribute("userPassword", "pwd1");
Attribute oc = new BasicAttribute("objectClass");
oc.add("dcObject");
oc.add("person");
oc.add("inetOrgPerson");
DirContext ctx = null;
try {
// get a handle to an Initial DirContext
ctx = new InitialDirContext(env);
// build the entry
Attributes entry = new BasicAttributes();
entry.put(cn);
entry.put(sn);
entry.put(mail);
entry.put(phone);
entry.put(uid);
entry.put(userPassword);
entry.put(oc);
// Add the entry
ctx.createSubcontext(entryDN, entry);
System.out.println("AddUser: added entry " entryDN ".");
} catch (NamingException e) {
System.err.println("AddUser: error adding entry." e);
}
}
}
Я получил следующую ошибку:
AddUser: ошибка при добавлении
entry.javax.naming.directory.Исключение NoSuchAttributeException: [LDAP: код ошибки 16 — 00000057: LdapErr: DSID-0C090C3E, комментарий: Ошибка в операции преобразования атрибута, данные 0, v1db1 ]; оставшееся имя cn= NewUser, dc= mydc, dc= local
Я не знаю, где ошибка. Может быть только неверный ввод атрибутов?
Комментарии:
1. Вы используете
dcObject
objectclass . Для этого OC требуетсяdc
, чтобы атрибут присутствовал в объекте, что не имеет особого смысла для persons (вы не должны использовать этот objectclass). Я почти уверен, что эта информация скрыта где-то в ошибке… вы должны использовать надлежащий механизм ведения журнала (например, SLF4J с обратным журналом) и не удалять трассировки стека исключений.2. Что ж, удалив этот объект, я получил следующее: [LDAP: код ошибки 32 — 0000208D: NameErr: DSID-0310020A, проблема 2001 (NO_OBJECT), данные 0, наилучшее совпадение: ‘DC = MYDC, DC = LOCAL’
3. Похоже, что с вашим корневым контекстом что-то не так … вы уверены, что он правильно определен?
Ответ №1:
Правильный код следующий:
public static void main(String[] args) {
String userName = "admin";
String password = "s3cret";
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://192.168.10.10:389/DC=SOFTWAREDEV,DC=LOCAL");
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, new String("softwaredev" "\" userName));
env.put(Context.SECURITY_CREDENTIALS, password);
String path = "OU=SoftwareV3,OU=SOFTWARE";
String newUser = "myUser"; // insert user here
String entryDN = "CN=" newUser "," path;
Attribute cn = new BasicAttribute("cn", newUser);
Attribute oc = new BasicAttribute("objectClass");
oc.add("top");
oc.add("person");
oc.add("organizationalPerson");
oc.add("user");
DirContext ctx = null;
try {
ctx = new InitialDirContext(env);
Attributes entry = new BasicAttributes();
entry.put(cn);
entry.put(oc);
ctx.createSubcontext(entryDN, entry);
System.out.println("AddUser: added entry " entryDN ".");
} catch (NamingException e) {
System.err.println("AddUser: error adding entry." e);
}
}
Комментарии:
1. Другими словами, DN был неправильным? Нет особого смысла публиковать исправленный код, если вы не сообщите нам, как он был исправлен.
2. Да. Я использовал wireshark и ldapadmin, чтобы увидеть правильный заголовок пакета, чтобы правильно его адаптировать.