Spring Security

Vamos lá! Como de costume, vamos começar a partir do projeto desse post. Primeiramente vamos adicionar no pom.xml a dependência do Spring Security

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

Nesse projeto, já temos endpoint de /products e /category. Depois de adicionar as dependências, todos os endpoints já ficam bloqueados e só podem ser acessdos com autenticação. Vamos criar uma classe de configuração para definir as regras de seurança.

package com.br.davifelipe.springjwt.config;

import java.util.Arrays;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
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;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
    public static final String[] PUBLIC_MATCHERS = {
        "/h2-console/**",
        "/products/**"
    };
    
    @Autowired
    private Environment env;
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        
        String[] activeProfiles = env.getActiveProfiles();
        
        if (Arrays.asList(activeProfiles).contains("dev")) {
            //disable it only for h2-console on dev envioment
            http.headers().frameOptions().disable();
        }
        
        http.cors().and().csrf().disable();
        http.authorizeRequests()
            .antMatchers(PUBLIC_MATCHERS)
            .permitAll()
            .anyRequest()
            .authenticated();
        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    }
    
    @Bean
    CorsConfigurationSource configurationSource() {
        final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", new CorsConfiguration().applyPermitDefaultValues());
        return source;
    }
}

Temos que fazer uma configuração adicional para que o h2-console funcione. Mas como só vamos utilizar o h2-comsole em ambiente de desenvolvimento, vamos criar um novo arquivo de propriedades application-dev.properties, copiar todas as configurações para ele, limpar o application.properties e deixar apenas essa linha informando que estamos no perfil de desenvolvimento

spring.profiles.active = dev

Dessa forma, quando a aplicação for para produção basta criar outro arquivo application-prod.properties e em application.properties setar o perfil prod como ativo.

Em PUBLIC_MATCHERS definimos que os endpoints /products e /h2-console serão públicos e podem ser acessados sem autenticação. 

Imagem

products ok. Retornou 404 por que não existe registro na base, mas não bloqueou o acesso. Já o endpoint /category bloqueou o acesso

Imagem

Comentários

 

Quem Sou

Graduado em ADS (Análise e desenvolvimento de sistemas).

Não sou "devoto" de nenhuma linguagem de programação. Procuro aproveitar o melhor de cada uma de acordo com a necessidade do projeto. Prezo por uma arquitetura bem feita, código limpo, puro e simples! 

anuncio atendente