Recuperar usuários LDAP

Fala galera tudo bom?

Estou com o seguinte problema…vim para um novo projeto e está sendo usado o LDAP para autenticação de usuários. Tenho uma tela(ou seja já esta logado com um usuário e tudo mais) onde o usuário vai digitar apenas o login para ver se o mesmo existe ou não, e todas as consultas que eu fiz na net para verificar isso é preciso passar o login e senha e na minha tela o usuário vai digitar apenas o login. Alguem pode me ajudar?

Pq vc não manda sempre uma senha falsa? Coloca como hidden na tela e pronto! :smiley:

Código para teste:

Hashtable env = new Hashtable();
env.put(Context.PROVIDER_URL, "ldap://<endereço do AD>:389");
env.put(Context.SECURITY_PRINCIPAL, USUARIO_QUE_VAI_EFETUAR_LOGIN);
env.put(Context.SECURITY_CREDENTIALS, SENHA);
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(LdapContext.CONTROL_FACTORIES, "com.sun.jndi.ldap.ControlFactory");
env.put(InitialContext.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.STATE_FACTORIES, "PersonStateFactory");
env.put(Context.OBJECT_FACTORIES, "PersonObjectFactory");

LdapContext context = new InitialLdapContext(env, null);
		
Object objeto = context.lookup(USUARIO_QUE_ESTA_SENDO_PROCURADO);
System.out.println(objeto);

Primeiramente desculpa a demora pois estava resolvendo problemas de outro projeto.

Fiz o teste hoje e me surgiu uma duvida Alexandre.

o método lookup me retorna um Object, e como peguei o contexto de acordo com o login e senha informado o único usuário que ele retorna é informado para o login. Existe alguma maneira e eu pegar o contexto do Ldap sem informar a senha para que eu possa retornar todos os usuários existentes? Ou melhor algum método para eu verificar se o usuário existe(porém sem passar a senha)?

[quote=Ismael_Jr]Primeiramente desculpa a demora pois estava resolvendo problemas de outro projeto.

Fiz o teste hoje e me surgiu uma duvida Alexandre.

o método lookup me retorna um Object, e como peguei o contexto de acordo com o login e senha informado o único usuário que ele retorna é informado para o login. Existe alguma maneira e eu pegar o contexto do Ldap sem informar a senha para que eu possa retornar todos os usuários existentes? Ou melhor algum método para eu verificar se o usuário existe(porém sem passar a senha)?[/quote]

Não dá… pense como se fosse um banco de dados: pra se logar no banco, você precisa de um usuário administrador, certo? É a mesma coisa com LDAP.

[]'s

Certo, e como eu fazia para trazer a lista de usuários existente ou verificar se um usuário existe? pois esse é meu problema pelo metodo q vc me passou eu navegando pelo objeto através do inspect do eclipse ele só me retorna o usuário. Então para eu conseguir retornar se o usuário existe ou não preciso da senha dele?

Eu recomendaria utilizar o spring-ldap vai poupar muito seu trabalho dê uma olhada:

http://static.springsource.org/spring-ldap/docs/1.3.x/reference/html/user-authentication.html

Eu agradeõ a dica e vou estudar de verdade…porém é uma aplicação já existente e eu preciso resolver isso…

Eu não disse que você precisa da senha do PRÓPRIO usuário, mas sim, que você precisa de UMA senha.

Vamos revisar o código que eu te passei:

Hashtable env = new Hashtable();
env.put(Context.PROVIDER_URL, "ldap://<endereço do AD>:389");
env.put(Context.SECURITY_PRINCIPAL, USUARIO_QUE_VAI_EFETUAR_LOGIN);  // Aqui, seria um usuário administrador
env.put(Context.SECURITY_CREDENTIALS, SENHA);  // Aqui, a senha do administrador
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(LdapContext.CONTROL_FACTORIES, "com.sun.jndi.ldap.ControlFactory");
env.put(InitialContext.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.STATE_FACTORIES, "PersonStateFactory");
env.put(Context.OBJECT_FACTORIES, "PersonObjectFactory");

LdapContext context = new InitialLdapContext(env, null);
		
Object objeto = context.lookup(USUARIO_QUE_ESTA_SENDO_PROCURADO); // Este lookup só vai te retornar o usuário se ele, de fato, existir
System.out.println(objeto);

Alí no lookup, se o usuário não existir, seu objeto vai ser nulo.

Vale lembrar que, alí na busca pelo usuário, você tem que passar o usuário completamente qualificado (cn=fulano,dn=contas,…). Se você quiser retornar um conjunto de usuários, você pode buscar a sub-árvore, ao invés de um usuário específico (isso, claro, assumindo que seu servidor LDAP está bem organizado).

[]'s

Ah ok pensei que vc iria desenvolver do zero.

Conforme Ismael_Jr disse vc precisa de usuário que se conecte no seu LDAP e faça consultas e modificações semelhante a uma conexão no banco de dados.

Alexandre Saudate,

Então passando apenas o login eu não consigo verificar se o usuário existe ou não?

[quote=Ismael_Jr]Alexandre Saudate,

Então passando apenas o login eu não consigo verificar se o usuário existe ou não?[/quote]

Por motivos de segurança não é bom, se você não estiver logado no LDAP, você poder checar a existência de um usuário qualquer. Só para dar um exemplo, quando você não consegue se logar em um site qualquer (como o GMail), e você erra a senha, ele não lhe responde “senha incorreta” mas sim “usuário ou senha incorreta” - senão você poderia saber que o sr. Bill Gates tem um usuário “billg” e aí é só ficar tentando uma senha atrás da outra :slight_smile:

entanglement estou logado com outro usuario “FULANO”, tenho uma tela q o usuario “FULANO” vai digita o nome de outro usuario para ver se o mesmo existe. Isso é possivel? Se sim como eu faria isso?

É possível. Você loga no LDAP com FULANO e procura o outro usuário.

Alexandre Saudate eu já fazia tudo com relação ao código que você passou apenas o lookup que ainda não tinha conhecimento. E os testes que eu fiz aqui ele nunca me retornou um objeto nulo, ou ele encontrava ou ele caia no catch direto. E também não consigo fazer isso passando o USER(Login) direto para ele tenho que passar dc=domain e dc=local, qualquer coisa diferente que eu passe pare ele ela cai no catch.

Pessoal agradeço as ajudas, pois foi através dos post que consegui chegar a uma solução. Como foi dito pelo Alexandre Saudate, eu precisava subir o contexto, entao o que eu fiz, peguei o login e senha do usuário logado para subir o contexto depois utilizei o LdapContext ctxGC = new InitialLdapContext(env, null) metodo ctxGC.search(String name, String filter, SearchControls searchCtls), esse cara me retorna um NamingEnumeration, e através dele vou navegando dentro do objeto até pegar o cara que eu preciso, caso ele não ache nada ele retorna NULL.

Pessoal agradeço as ajudas, pois foi através dos post que consegui chegar a uma solução. Como foi dito pelo Alexandre Saudate, eu precisava subir o contexto, entao o que eu fiz, peguei o login e senha do usuário logado para subir o contexto depois utilizei o LdapContext ctxGC = new InitialLdapContext(env, null) metodo ctxGC.search(String name, String filter, SearchControls searchCtls), esse cara me retorna um NamingEnumeration, e através dele vou navegando dentro do objeto até pegar o cara que eu preciso, caso ele não ache nada ele retorna NULL.

Galera tenho mais um problema no Ldap, agora preciso buscar um usuario com o Member Of default do Ldap alguem pode me ajudar?

Olá
Ismael,

É a mesma idéia que vc fez para recuperar um usuário no LDAP, porém vc precisa executar uma query semelhante a isso:

(memberof=cn=login*)

Nesta query busca através do memberof logins que comecem login* o * é como se fosse wildcard do SQL %
Nao se esqueca de verificar se o atributo memberof esta indexado para pesquisa