@RequiredArgsConstructor // Faz com que quando a classe for instanciada, os atributos vão ser passados no construtor automaticamente.
@EnableWebSecurity // Desabilita as configurações default do Spring Security, permitindo a gente á configurar as nossas próprias.
@Configuration // Indica que é uma classe de configuração
public class SecurityConfigurationsImpl { // As classes de Security só são chamadas quando a aplicação sobe!
// Nas proximas requisições, essa classe não é chamada dnv, pois as conf já estão salvas.
private final TokenServiceImpl tokenService; // Classe que contém ações de um token como gerar um token...
private final UserRepository userRepository; // Repositório da entidade Usuário
@Override
@Bean
public PasswordEncoder encoder() {
return new BCryptPasswordEncoder();
}
@Override
@Bean
public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception { // AuthManager, Conf de autenticação.
return authenticationConfiguration.getAuthenticationManager();
}
@Override
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { // Configs de Autorização.
http.authorizeRequests()// Autorização de requests
.antMatchers("/auth").permitAll() // Estou permitindo TUDO E TODOS acessarem esse recurso no sistema.
.antMatchers("/userarea/**").authenticated() // Para acessar esse recurso, tem q estar autenticado.
.antMatchers("/users/register").permitAll() // Estou permitindo TUDO E TODOS acessarem esse recurso no sistema.
.antMatchers("/users/**").hasRole("ADMIN") // Para acessas esse curso, a pessoa logada tem que ser ADM
.anyRequest().denyAll() // Qualquer outro recurso, sem ser os de cima, serão bloqueados ( securança pra manutenção). No caso, não tem outros recurso.
.and().cors() // Libera a integração de aplicações externas como o front-end á essa API.
.and().headers().frameOptions().disable() // É para bloquear a página de login ser colocada em um iFrame
.and().csrf().disable() // Comentário sobre essa conf na linha 93.
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) // DIZ QUE A APLICAÇÃO NÃO TEM ESTADO, OS DADOS SÃO GUARDADOS EM UM TOKEN!
.and().addFilterBefore(new AuthenticationJWTFilter(tokenService, userRepository), UsernamePasswordAuthenticationFilter.class); // Adiciona um FILTRO, Antes
return http.build();
}
@Override
@Bean
public WebSecurityCustomizer webSecurityCustomizer() {
return (web) -> web.ignoring().antMatchers
("/swagger-ui/**", "/v3/api-docs/**", "/h2-console/**");
}
@Override
@Bean
public CorsConfigurationSource corsConfigurationSource() { // Método relacionado á CORS, integração com um meio externo.
CorsConfiguration configuration = new CorsConfiguration().applyPermitDefaultValues();
configuration.setAllowedMethods(Arrays.asList("POST", "GET", "PUT", "DELETE", "OPTIONS"));
final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
}
/*
csrf - é uma proteção contra hackers que "roubam a sessão", como estamos usando staless, n temos sessão, e deixar essa conf(padrão habilitada)
não teria sentido, pois é um cenário impossivel, por isso desativamos.
*/
}