OpenLDAP и Java
Некоторое время назад на Mtaalamu было опубликовано несколько топиков о сервере OpenDS — Java-реализации службы каталогов, аналогичной OpenLDAP. Как специалист по Java, не мог не заинтересоваться этим продуктом. Через некоторое время стало понятно, что это один из проектов, из-за которых разорилась фирма Sun: ничего принципиально нового по сравнению с имеющимися реализациями там не содержалось, а места на жестком диске и оперативной памяти OpenDS занимает больше своих собратьев. Не случайно Oracle не взяла его «на борт», спасая Java. Однако изучение продукта не прошло без пользы: в ходе его изучения хорошо освоил технологию LDAP, стал использовать ее в своих проектах. Но как же стыковка с Java?
Оказывается, изобретать, как всегда, ничего не нужно. На сайте OpenLDAP предлагается Java-пакет для работы со службой каталогов. Правда, всё там очень лаконично и даже без документации. Точнее она есть, но зашита в исходный код. Пришлось ее сгенерировать. Если кому-то потребуется — забирайте по этой ссылке. Там же можно найти и примеры кода. Сам пакет весьма компактный, предлагается для загрузки в форме git-репозитория, собирается без проблем.
Вот, например, код построенного на основе этого пакета OSGi-модуля для сервера Apache Felix:
Думаю, разобраться можно. Если кому-то нужны подробности — обращайтесь в личку, пишите комменты.
Оказывается, изобретать, как всегда, ничего не нужно. На сайте OpenLDAP предлагается Java-пакет для работы со службой каталогов. Правда, всё там очень лаконично и даже без документации. Точнее она есть, но зашита в исходный код. Пришлось ее сгенерировать. Если кому-то потребуется — забирайте по этой ссылке. Там же можно найти и примеры кода. Сам пакет весьма компактный, предлагается для загрузки в форме git-репозитория, собирается без проблем.
Вот, например, код построенного на основе этого пакета OSGi-модуля для сервера Apache Felix:
package net.sf.lab3f.ldap;
import java.io.FileInputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.Vector;
import com.novell.ldap.LDAPAttribute;
import com.novell.ldap.LDAPAttributeSet;
import com.novell.ldap.LDAPConnection;
import com.novell.ldap.LDAPEntry;
import com.novell.ldap.LDAPException;
import com.novell.ldap.LDAPMessage;
import com.novell.ldap.LDAPModification;
import com.novell.ldap.LDAPSearchQueue;
import com.novell.ldap.LDAPSearchResult;
import com.novell.ldap.LDAPSearchResultReference;
import com.novell.ldap.LDAPResponseQueue;
import com.novell.ldap.util.Base64;
public class Main implements Ldapable{
private LDAPConnection conn;
private Properties props = new Properties();
public void stop () throws Exception{
conn.disconnect();
}
public void start () throws Exception{
props.load(new FileInputStream("conf/ldap.properties"));
conn = new LDAPConnection();
conn.connect("localhost", 389);
conn.bind(LDAPConnection.LDAP_V3, props.getProperty("admin"), props.getProperty("passwd").getBytes());
System.out.println("[INFO] LDAP connection established");
}
public boolean add(String dn, Map <String, String[]> params){
if(conn == null) return false;
try{
Vector <LDAPAttribute> v = new Vector <LDAPAttribute> ();
LDAPAttributeSet attrs = new LDAPAttributeSet();
Set <String> keys = params.keySet();
Iterator <String> iter = keys.iterator();
while(iter.hasNext()){
String key = iter.next();
LDAPAttribute attr = new LDAPAttribute(key);
for(String s : params.get(key))attr.addValue(s);
v.add(attr);
}
attrs.addAll(v);
LDAPEntry ent = new LDAPEntry(dn, attrs);
conn.add(ent, (LDAPResponseQueue)null);
return true;
}
catch(LDAPException ex){System.out.println(ex);return false;}
}
public boolean delete(String dn){
if(conn == null) return false;
try{
conn.delete(dn, (LDAPResponseQueue)null);
return true;
}
catch(LDAPException ex){System.out.println(ex);return false;}
}
public boolean modify(String dn, Map <String, String[]> params){
if(conn == null) return false;
try{
Vector <LDAPModification> v = new Vector <LDAPModification> ();
Set <String> keys = params.keySet();
Iterator <String> iter = keys.iterator();
while(iter.hasNext()){
String key = iter.next();
LDAPAttribute attr = new LDAPAttribute(key);
for(String s : params.get(key))attr.addValue(s);
LDAPModification mod = new LDAPModification(LDAPModification.REPLACE, attr);
v.add(mod);
}
conn.modify(dn, v.toArray(new LDAPModification[]{}), (LDAPResponseQueue)null);
return true;
}
catch(LDAPException ex){System.out.println(ex);return false;}
}
public Map <String, Map<String, String[]>> searchOne(String searchBase, String searchFilter, String[] attrs){
return search(searchBase, LDAPConnection.SCOPE_ONE, searchFilter, attrs);
}
public Map <String, Map<String, String[]>> searchSub(String searchBase, String searchFilter, String[] attrs){
return search(searchBase, LDAPConnection.SCOPE_SUB, searchFilter, attrs);
}
public Map <String, Map<String, String[]>> searchBase(String searchBase, String searchFilter, String[] attrs){
return search(searchBase, LDAPConnection.SCOPE_BASE, searchFilter, attrs);
}
private Map <String, Map<String, String[]>> search(String searchBase, int scope, String searchFilter, String[] attrs){
try{
LDAPSearchQueue queue = conn.search(searchBase, scope, searchFilter, attrs, false, (LDAPSearchQueue)null); //, (LDAPSearchConstraints)null);
LDAPMessage message = null;
Map <String, Map<String, String[]>> replay = new HashMap <String, Map<String, String[]>>();
while((message = queue.getResponse()) != null ){
if(!(message instanceof LDAPSearchResult)) continue;
LDAPEntry entry = ((LDAPSearchResult)message).getEntry();
LDAPAttributeSet attributeSet = entry.getAttributeSet();
Iterator allAttributes = attributeSet.iterator();
Map <String, String[]> attrsMap = new HashMap <String, String[]> ();
while(allAttributes.hasNext()){
LDAPAttribute attribute = (LDAPAttribute)allAttributes.next();
String attributeName = attribute.getName();
Vector <String> v = new Vector <String> ();
Enumeration allValues = attribute.getStringValues();
if(allValues == null) continue;
while(allValues.hasMoreElements()) v.add((String) allValues.nextElement());
attrsMap.put(attributeName, v.toArray(new String[]{}));
replay.put(entry.getDN(), attrsMap);
}
}
return replay.size() == 0 ? null : replay;
}
catch(LDAPException ex){System.out.println(ex);return null;}
}
public String encodeB64(String s){
if(Base64.isLDIFSafe(s))return " " + s;
return ": " + Base64.encode(s);
}
}
Думаю, разобраться можно. Если кому-то нужны подробности — обращайтесь в личку, пишите комменты.

Комментарии (3)
RSS свернуть / развернутьно нужно добавить в имя файла сопроводительную информацию — для какой версии документация например
Sergei_T
yababay
Sergei_T
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.