Autenticação via Active Directory
30/06/2017 11:58
1
Pessoal, tudo bem?

Sou dev Jr, estou no meu primeiro projeto usando Spring e um dos requisitos é a autenticação dos usuários ser feita via AD.

Alguém por aqui já construiu algo parecido? Eu tentei seguir alguns exemplos, inclusive usando a documentação oficial, porém não consegui evoluir muito. Alguém poderia me dar um auxilio?

Desde já muito obrigado!
Tags: Spring, Security, LDAP, AD


1
O spring security tem um modulo dedicado a autenticação via LDAP e tem um getting started bem simples. Tente ser um pouco mais especifico sobre oq não funcionou e se seu projeto é spring boot ou não. Assim fica mais facil para entender e conseguir te ajudar.
30/06/2017 12:33


1
Eu já tentei algo parecido.

No entanto não foi usando o módulo LDAP do Spring Security, mas sim o template LDAP que o próprio Spring oferece. O que ocorre é que o AD, apesar de ser um serviço LDAP, é um pouco diferente do LDAP tradicional (não segue exatamente os mesmos padrões).

Um ponto importante que muita gente acaba perdendo muito tempo: a não ser que as permissões do seu sistema estejam relacionadas a grupos, o AD é usado essencialmente apenas para autenticação, isto é, dizer que suas credenciais realmente existem, não autorização, isto é, dizer o que você pode fazer.

Sendo assim, a abordagem vai ser: primeiro conseguir obter os dados do seu usuário usando o próprio LDAP (basicamnete login, nome, atributos assim) e, na sequência, com base nestas informações, obter as permissões usando algo como um banco de dados ou alguma fonte de dados.

Gostaria de poder dizer que é algo trivial lidar com o AD, mas não é: pode ser bem chatinho. Estou aqui pre te ajudar, pois também já apanhei muito disto. :)


0
Então FELIPE ADORNO, eu implementei o passo a passo da documentação oficial, mas estou esbarrando nessa diferença citada pelo Henrique Lobo Weissmann. Não consegui entender bem como adaptar o exemplo as particularidades do serviço LDAP da Microsoft. Neste projeto estamos usando Spring Boot. A ideia é sim apenas autenticar os usuários via AD. Obrigado pela dica! Vou tentar basear a solução nesse template! 
PS: Parabéns pelo trabalho de difundir conhecimento através das comunidades e publicações Henrique, seu livro de GRAILS, publicado pela Casa do Código tem me ajudado muito!
03/07/2017 07:59


1
Oi Lucas, valeu!

O que fiz no caso do AD foi implementar na unha mesmo a integração usando a própria API JNDI do Java. Mas creio que a melhor solução seja usando os templates do Spring, que tornam a coisa muito mais fácil.

Algo que você precisa ficar atento: o FECHAMENTO da conexão com o AD. Não é sempre que a conexão é fechada e, com isto, acabamos tendo problemas do tipo exaustão de recursos no servidor. É bem chato.


1
Lucas, eu nunca implementei e buscando na internet acabei vendo essa classe ActiveDirectoryLdapAuthenticationProvider não sei se você está usando ela. O que mais tem de exemplos são utilizando xml, mas vc pode entrar no gitter e dar uma perguntada pro pessoal lá e postar a exception que você está tomando. Se você tiver esse código no github e conseguir compartilhar com a gnt fica mais facil de ajudar.
03/07/2017 16:30


0
Infelizmente não me permitem publicar o código no github Felipe. Mas a classe ActiveDirectoryLdapAuthenticationProvider foi a solução! Autenticação está funcionando. Vou publicar aqui para o caso de mais alguém esbarrar em um requisito assim:
Pom.xml
?      <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
   </dependency>
<dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-test</artifactId>
       <scope>test</scope>
   </dependency>
<dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-security</artifactId>
   </dependency>
<dependency>
       <groupId>org.springframework.security</groupId>
       <artifactId>spring-security-ldap</artifactId>
   </dependency>

WebSecurityConfig.Java
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
    public ActiveDirectoryLdapAuthenticationProvider activeDirectoryLdapAuthenticationProvider() {
        ActiveDirectoryLdapAuthenticationProvider provider = new ActiveDirectoryLdapAuthenticationProvider("DOMINIO","ENDEREÇO_SERVIDOR_LDAP"); //Não é necessário informar a porta.
            provider.setConvertSubErrorCodesToExceptions(true);
            provider.setUseAuthenticationRequestCredentials(true);
        return provider;
    }
    @Bean
    public LoggerListener loggerListener() {
        return new LoggerListener();
    }
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(activeDirectoryLdapAuthenticationProvider());
    }

@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin()
.and()
       .csrf()
   .and()
       .httpBasic();
}

}

HomeController.Java (apenas para teste)
@RestController
public class HomeController {
@GetMapping("/")
public String index() {
  return "Welcome to the home page!";
}
}

Muito obrigado FELIPE e Henrique! Autenticar é parte da solução. O requisito todo é:
1 - Autenticar o usuário via AD;
2 - Atribuir a ele as permissões (que estão armazenadas no BD da aplicação).

É uma boa estratégia? Tenho alguma alternativa melhor?
03/07/2017 17:14


1
Legal que funcionou Lucas, então cara você tem os grupos do AD, então não seria melhor utilizar esses grupos para definir os acessos?
03/07/2017 19:36


0
Então Felipe, as permissões tem que ser atribuídas quase que a nível de usuário pra esse projeto... Usar os grupos do AD não são uma opção infelizmente.
04/07/2017 08:09


1
É cara então coloca as roles na base de dados mesmo e compõe o seu UserDetails com ela :)
04/07/2017 10:53


0
Olá pessoal nunca testei e vi que você já conseguiu, mas como encontrei por curiosidade este projeto vou postar, caso alguém tenha curiosidade de testar.

https://github.com/deeprot/spring-saml-adfs
06/07/2017 21:33



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails, Spring e mais com a Formação itexto!

Livro de Spring


/dev/All

Os melhores blogs de TI
em um único lugar!

 
Spring Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.