Recuperando Atributos LDAP [Resolvido]

2 respostas
L

olá pessoal,

criei uma estrutura para testes no LDAP e estou tentando recuperar os atributos de um nó especifico.
Estou tentando recuperar o atributo MEMBER. Só que está vindo apenas o primeiro que está sendo criado no script. É possível retornar vários atributos com o mesmo nome? Se não, como criar a estrutura para armazenar, por exemplo, uma lista de valores.

O objetivo desta função é passar por parâmetro uma String, no caso o valor de algum MEMBER, e retornar o perfil de acordo com o nome.

Desde já agradeço.

Abaixo está o código e o script.
public String searchUser(String userName){
		try{
			Hashtable env = new Hashtable();

		    String sp = "com.sun.jndi.ldap.LdapCtxFactory";
		    env.put(Context.INITIAL_CONTEXT_FACTORY, sp);		    
		    env.put(Context.PROVIDER_URL, ldapUrl);
		    
		    env.put(Context.SECURITY_AUTHENTICATION, "simple");
		    env.put(Context.SECURITY_PRINCIPAL, "uid=" + user + ",ou=system");
		    env.put(Context.SECURITY_CREDENTIALS, pass);
		    
		    DirContext dctx = new InitialDirContext(env);
		    
		    String base = "";

		    SearchControls sc = new SearchControls();
		    String[] attributeFilter = { "" };
		    sc.setReturningAttributes(attributeFilter);
		    sc.setSearchScope(SearchControls.SUBTREE_SCOPE);

		    String filter = "(objectClass=*)";
		    
		    NamingEnumeration results = dctx.search(base, filter, sc);
		    
		    while (results.hasMore()){
		    	
		    	SearchResult sr = (SearchResult) results.next();			    
		    	
		    	String _nameOfNode = sr.getName();
			    Attributes attrs = sr.getAttributes();  	     	  
			    	  
			    NamingEnumeration an = attrs.getAll();
			    
			    try{
			    	NamingEnumeration ab = attrs.getIDs();
			    	
			    	Attribute abc = attrs.get("member");
			    	System.out.println(abc.get());
			    }catch (Exception ertr){ertr.printStackTrace();}
			    
			    String _attributes = "";
			    	  
			    Vector<Attribute> vSource = new Vector<Attribute>();
			    
			    // NAO IMPORTA QTOS ATRIBUTOS TENHA, ELE PEGA APENAS O PRIMEIRO !!!! 
			    while (an.hasMoreElements()){
			    	try{
			    		Attribute a = (Attribute) an.next();
				    	//System.out.println(" 1 - " + a.get());
				    	//if (a.getID().toString().contains("member")){
				    		if (a.get().toString().contains(userName)){
				    			if (!_nameOfNode.toString().split(",")[0].contains(userName)){
				    				System.out.println(_nameOfNode.split(",")[0].split("=")[1]);
				    			}
				    			
				    		}
			    	}catch (Exception ert){ert.printStackTrace();}
			    
			    }		   
		    }
		}catch (Exception er){er.printStackTrace();}
		return "";
	}
dn: dc=example,dc=com
objectClass: domain
objectClass: extensibleObject
objectClass: top
dc: example

dn: o=caixa_amb,dc=example,dc=com
objectClass: organization
o: caixa_amb

dn: ou=usuarios,o=caixa_amb,dc=example,dc=com
objectClass: organizationalUnit
ou: usuarios

dn: ou=useradmin,o=caixa_amb,dc=example,dc=com
objectClass: organizationalUnit
ou: useradmin

dn: ou=admin,o=caixa_amb,dc=example,dc=com
objectClass: organizationalUnit
ou: admin

dn: ou=aplicacoes,o=caixa_amb,dc=example,dc=com
objectClass: organizationalUnit
ou: aplicacoes

dn: ou=aplicacao01, ou=aplicacoes,o=caixa_amb,dc=example,dc=com
objectClass: organizationalUnit
ou: aplicacao01

dn: ou=simbrasil, ou=aplicacoes,o=caixa_amb,dc=example,dc=com
objectClass: organizationalUnit
ou: simbrasil

dn: ou=perfil_admin, ou=simbrasil, ou=aplicacoes,o=caixa_amb,dc=example,dc=com
objectClass: organizationalUnit
objectClass: extensibleObject
member: cn=Pedro, ou=usuarios, o=caixa_amb, dc=example, dc=com
member: cn=Cesar, ou=useradmin, o=caixa_amb, dc=example, dc=com 
member: cn=sa, ou=useradmin, o=caixa_amb, dc=example, dc=com
postalCode: 1234567
ou: perfil_admin

dn: ou=perfil_usuario, ou=simbrasil, ou=aplicacoes,o=caixa_amb,dc=example,dc=com
objectClass: organizationalUnit
postalCode: 98765432
ou: perfil_usuario

dn: ou=perfil_1, ou=aplicacao01, ou=aplicacoes,o=caixa_amb,dc=example,dc=com
objectClass: organizationalUnit
postalCode: 2222222
ou: perfil_1

dn: ou=perfil_2, ou=aplicacao01, ou=aplicacoes,o=caixa_amb,dc=example,dc=com
objectClass: organizationalUnit
postalCode: 111111
ou: perfil_2

dn: cn=Jose Carlos, ou=admin, o=caixa_amb, dc=example, dc=com
objectClass: organizationalPerson
cn: Jose Carlos
sn: Jose Carlos

dn: cn=Ze, ou=admin, o=caixa_amb, dc=example, dc=com
objectClass: organizationalPerson
cn: Ze
sn: Ze

dn: cn=Antonio, ou=usuarios, o=caixa_amb, dc=example, dc=com
objectClass: organizationalPerson
cn: Antonio
sn: Antonio

dn: cn=Pedro, ou=usuarios, o=caixa_amb, dc=example, dc=com
objectClass: organizationalPerson
cn: Pedro
sn: Pedro

dn: cn=sa, ou=useradmin, o=caixa_amb, dc=example, dc=com
objectClass: organizationalPerson
cn: sa
sn: sa

dn: cn=Cesar, ou=useradmin, o=caixa_amb, dc=example, dc=com
objectClass: organizationalPerson
cn: Cesar
sn: Cesar

2 Respostas

G

Antes de tudo, só dando uma reforçada no conceito: o objeto não tem vários atributos MEMBER, e sim um atributo com vários valores.

Para tratar um atributo com multiplos valores você pode fazer o seguinte:

No lugar onde usou:

Attribute a = (Attribute) an.next(); //... mais codigo.... a.get() //.... //... mais codigo...
Utilize a.getAll() para retornar um enumeration com os valores do atributo, aí você itera nesse enumeration para encontrar o que deseja.

Se desejar saber de antemão se o atributo possui um ou diversos valores, utilize a.size() que retorna a quantidade.

Espero ter ajudado!

L

resolveu sim, vlw cara. Segue abaixo o código de como ficou.

public String searchUser(String userName){
		try{
			Hashtable env = new Hashtable();

		    String sp = "com.sun.jndi.ldap.LdapCtxFactory";
		    env.put(Context.INITIAL_CONTEXT_FACTORY, sp);		    
		    env.put(Context.PROVIDER_URL, ldapUrl);
		    
		    env.put(Context.SECURITY_AUTHENTICATION, "simple");
		    env.put(Context.SECURITY_PRINCIPAL, "uid=" + user + ",ou=system");
		    env.put(Context.SECURITY_CREDENTIALS, pass);
		    
		    DirContext dctx = new InitialDirContext(env);
		    
		    String base = "";

		    SearchControls sc = new SearchControls();
		    String[] attributeFilter = { "" };
		    sc.setReturningAttributes(attributeFilter);
		    sc.setSearchScope(SearchControls.SUBTREE_SCOPE);

		    String filter = "(objectClass=*)";
		    
		    NamingEnumeration results = dctx.search(base, filter, sc);
		    
		    while (results.hasMore()){
		    	
		    	SearchResult sr = (SearchResult) results.next();			    
		    	
		    	String _nameOfNode = sr.getName();
			    Attributes attrs = sr.getAttributes();  	     	  
			    	  
			    NamingEnumeration an = attrs.getAll();
			    
			    String _attributes = "";			      
			    Vector<Attribute> vSource = new Vector<Attribute>();
			    
			    while (an.hasMoreElements()){
			    	try{
			    		Attribute a = (Attribute) an.next();
			    		for(int i=0; i< a.size(); i++){
			    			if (a.get(i).toString().contains("=" + userName)){
				    			if (!_nameOfNode.toString().split(",")[0].contains(userName)){
				    				System.out.println(_nameOfNode.split(",")[0].split("=")[1]);
				    			}				    			
				    		}
			    		}				    	
			    	}catch (Exception ert){}			    
			    }		   
		    }
		}catch (Exception er){er.printStackTrace();}
		return "";
	}
Criado 6 de maio de 2009
Ultima resposta 6 de mai. de 2009
Respostas 2
Participantes 2