Bom dia pessoal. Gostaria de uma ajuda dos ninjas de spring.
Tenho uma aplicação web e gostaria que o usuário se autenticassem no LDAP com o usuário de rede do domínio.
Mas eu queria de uma forma que conecte no LDAP com as credenciais do usuário, e caso se conecte no LDAP é porque o usuário e senha está correto, pois eu não tenho acesso a chave de password e nem querem liberar.
Por exemplo, tenho um formulário de login com usuário e senha, quando clicar no logar o spring deve pegar esse usuário e senha e tentar se conectar no LDAP, se conectar abre o sistema, se não mostra mensagem de usuário ou senha invalida.
Todos os exemplo que encontrei eram de conectar com um usuário especifico no LDA e depois comparar a senha digitada do usuário com a chave do ldap.
Alguém sabe como eu poderia fazer ?
Desde já Muito Obrigado
http://docs.spring.io/spring-ldap/docs/1.3.x/reference/html/user-authentication.html
http://docs.spring.io/spring-security/site/docs/3.1.x/reference/ldap.html
package hello;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().fullyAuthenticated()
.and()
.formLogin();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
.ldapAuthentication()
.userDnPatterns("uid={0},ou=people")
.groupSearchBase("ou=groups")
.contextSource().ldif("classpath:test-server.ldif");
}
}
acredito que atende, não?
Olá Getulio, obrigado pela resposta, mas é quase isso.
Na verdade o que eu preciso seria algo tipo isso mas no spring:
try {
Hashtable<String, String> ldapEnv = new Hashtable<String, String>(11);
ldapEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
ldapEnv.put(Context.PROVIDER_URL, "ldap://IP_SERVIDOR_ADLDAP:389/DC=empresa,DC=dom");
ldapEnv.put(Context.SECURITY_AUTHENTICATION, "simple");
ldapEnv.put(Context.SECURITY_PRINCIPAL, "USUARIO");
ldapEnv.put(Context.SECURITY_CREDENTIALS, "SENHA");
DirContext ldapContext = new InitialDirContext(ldapEnv);
System.out.println("Conectado.... Usuario e senha OK...");
} catch (Exception ex) {
System.out.println("Nao Conectou: " + ex);
}
Entendeu ?
Por exemplo, usar o spring para testar a senha para conectar, e não precisar de um usuário para se conectar no AD/LDAP e depois validar o usuário da tela de login.
Mas o spring exige um usuário para se conectar no LDAP:
DefaultSpringSecurityContextSource contextSource = new DefaultSpringSecurityContextSource("ldap://IP_SERVIDOR_ADLDAP:389/...............");
contextSource.setUserDn("usuario");
contextSource.setPassword("senha");
contextSource.setReferral("follow");
contextSource.afterPropertiesSet();
LdapAuthenticationProviderConfigurer ldapAuthenticationProviderConfigurer = auth.ldapAuthentication();
ldapAuthenticationProviderConfigurer.userSearchFilter("(&(sAMAccountName={0}))").contextSource(contextSource);
Alguém tem alguma ideia ?