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?
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.
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 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).
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
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?
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.
É 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