Introdução ao Java Config para Spring Security

Introdução ao Java Config para Spring Security

1. Visão geral

Este artigo éan introduction to Java configuration for Spring Security, que permite aos usuários configurar facilmente o Spring Security sem o uso de XML.

A configuração Java foi adicionada à estrutura Spring emSpring 3.1e estendida para Spring Security emSpring 3.2e é definida em uma classe anotada@Configuration.

2. Configuração do Maven

Para usar Spring Security em um projeto Maven, primeiro precisamos ter a dependênciaspring-security-core no projetopom.xml:


    org.springframework.security
    spring-security-core
    4.1.3.RELEASE

A versão mais recente sempre pode ser encontradahere.

3. Segurança da Web com configuração Java

Vamos começar com um exemplo básico de configuração Spring Security Java:

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth)
      throws Exception {
        auth.inMemoryAuthentication().withUser("user")
          .password("password").roles("USER");
    }
}

Como você deve ter notado, a configuração define uma configuração básica de autenticação na memória.

4. Segurança HTTP

Para habilitar a segurança HTTP no Spring, precisamos estender oWebSecurityConfigurerAdapter para fornecer uma configuração padrão no métodoconfigure(HttpSecurity http):

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

A configuração padrão acima garante que qualquer solicitação ao aplicativo seja autenticada com login baseado em formulário ou autenticação básica HTTP.

Além disso, é exatamente semelhante à seguinte configuração XML:


    
    
    

5. Login do formulário

Curiosamente, o Spring Security gera uma página de login automaticamente, com base nos recursos ativados e usando valores padrão para a URL que processa o login enviado:

protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
      .anyRequest().authenticated()
      .and().formLogin()
      .loginPage("/login").permitAll();
}

Aqui, a página de login gerada automaticamente é conveniente para começar a funcionar rapidamente.

6. Autorização com funções

Vamos agora configurar algumas autorizações simples em cada URL usando funções:

protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
      .antMatchers("/", "/home").access("hasRole('USER')")
      .antMatchers("/admin/**").hasRole("ADMIN")
      .and()
      // some more method calls
      .formLogin();
}

Observe como estamos usando a API de tipo seguro -hasRole - mas também a API baseada em expressão, viaaccess.

7. Sair

Como muitos outros aspectos do Spring Security, o logout possui ótimos padrões fornecidos pela estrutura.

Por padrão, uma solicitação de logout invalida a sessão, limpa todos os caches de autenticação, limpaSecurityContextHoldere redireciona para a página de login.

Aqui está uma configuração de logout simples:

protected void configure(HttpSecurity http) throws Exception {
    http.logout();
}

No entanto, se você deseja obter mais controle sobre os manipuladores disponíveis, veja como será uma implementação mais completa:

protected void configure(HttpSecurity http) throws Exception {
    http.logout().logoutUrl("/my/logout")
      .logoutSuccessUrl("/my/index")
      .logoutSuccessHandler(logoutSuccessHandler)
      .invalidateHttpSession(true)
      .addLogoutHandler(logoutHandler)
      .deleteCookies(cookieNamesToClear)
      .and()
      // some other method calls
}

8. Autenticação

Vamos dar uma olhada em outra maneira de permitir a autenticação com o Spring Security.

8.1. Autenticação na memória

Começaremos com uma configuração simples na memória:

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth)
  throws Exception {
    auth.inMemoryAuthentication()
      .withUser("user").password("password").roles("USER")
      .and()
      .withUser("admin").password("password").roles("USER", "ADMIN");
}

8.2. Autenticação JDBC

Para mover isso para o JDBC, tudo o que você precisa fazer é definir uma fonte de dados no aplicativo - e usá-la diretamente:

@Autowired
private DataSource dataSource;

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth)
  throws Exception {
    auth.jdbcAuthentication().dataSource(dataSource)
      .withDefaultSchema()
      .withUser("user").password("password").roles("USER")
      .and()
      .withUser("admin").password("password").roles("USER", "ADMIN");
}

9. Conclusão

Neste tutorial rápido, abordamos os conceitos básicos de Java Configuration for Spring Security e focamos nas amostras de código que ilustram os cenários de configuração mais simples.