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!
A
Alexandre_Saudate
Código para teste:
Hashtableenv=newHashtable();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");LdapContextcontext=newInitialLdapContext(env,null);Objectobjeto=context.lookup(USUARIO_QUE_ESTA_SENDO_PROCURADO);System.out.println(objeto);
I
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)?
A
Alexandre_Saudate
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)?
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
I
Ismael_Jr
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?
R
ramilani12
Eu recomendaria utilizar o spring-ldap vai poupar muito seu trabalho dê uma olhada:
Eu agradeõ a dica e vou estudar de verdade…porém é uma aplicação já existente e eu preciso resolver isso…
A
Alexandre_Saudate
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:
Hashtableenv=newHashtable();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 administradorenv.put(Context.SECURITY_CREDENTIALS,SENHA);// Aqui, a senha do administradorenv.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");LdapContextcontext=newInitialLdapContext(env,null);Objectobjeto=context.lookup(USUARIO_QUE_ESTA_SENDO_PROCURADO);// Este lookup só vai te retornar o usuário se ele, de fato, existirSystem.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
R
ramilani12
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.
I
Ismael_Jr
Alexandre Saudate,
Então passando apenas o login eu não consigo verificar se o usuário existe ou não?
E
entanglement
Ismael_Jr:
Alexandre Saudate,
Então passando apenas o login eu não consigo verificar se o usuário existe ou não?
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
I
Ismael_Jr
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?
A
Alexandre_Saudate
É possível. Você loga no LDAP com FULANO e procura o outro usuário.
I
Ismael_Jr
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.
I
Ismael_Jr
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.
I
Ismael_Jr
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.
I
Ismael_Jr
Galera tenho mais um problema no Ldap, agora preciso buscar um usuario com o Member Of default do Ldap alguem pode me ajudar?
R
ramilani12
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