OpenLDAP и Java

Некоторое время назад на Mtaalamu было опубликовано несколько топиков о сервере OpenDS — Java-реализации службы каталогов, аналогичной OpenLDAP. Как специалист по Java, не мог не заинтересоваться этим продуктом. Через некоторое время стало понятно, что это один из проектов, из-за которых разорилась фирма Sun: ничего принципиально нового по сравнению с имеющимися реализациями там не содержалось, а места на жестком диске и оперативной памяти OpenDS занимает больше своих собратьев. Не случайно Oracle не взяла его «на борт», спасая Java. Однако изучение продукта не прошло без пользы: в ходе его изучения хорошо освоил технологию LDAP, стал использовать ее в своих проектах. Но как же стыковка с Java?

Оказывается, изобретать, как всегда, ничего не нужно. На сайте 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);
 }	 
} 


Думаю, разобраться можно. Если кому-то нужны подробности — обращайтесь в личку, пишите комменты.
  • +4
  • 16 апреля 2011, 19:55
  • yababay

Комментарии (3)

RSS свернуть / развернуть
+
0
я могу выложить документацию на наш файловый сервер
но нужно добавить в имя файла сопроводительную информацию — для какой версии документация например
avatar

Sergei_T

  • 17 апреля 2011, 01:05
+
0
Конечно нужно! Это называется openldap-jldap версия 4.6 от 2009-07-06. У меня много документации по Java, Groovy и т.п. Хорошо бы ее всю выложить, а то поисковики часто выдают устаревшие версии или еще какую-нибудь фигню. Но это надо на флешке передавать, т.к. очень много. Принесу на линуксовку.
avatar

yababay

  • 17 апреля 2011, 12:46
+
0
ок, так и сделаем)
avatar

Sergei_T

  • 17 апреля 2011, 18:21

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.