Como utilizamos um SSO, na nossa aplicação precisamos apenas validar se o Token JWT recebido nas requisições está correto. Mas no desenvolvimento local precisamos simular esse controle, pois o servidor real não aceita requisições de qualquer endereço, apenas do servidor de aplicação autorizado.
Para isso ajustamos no application.properties
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration,org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration
E ajustamos
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.csrf(csrf -> csrf.disable())
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.jee(jee -> jee.disable())
.formLogin(formLogin ->formLogin.disable())
.httpBasic(httpBasic -> httpBasic.disable())
.cors (cors -> cors.configurationSource(corsConfigurationSource()))
.authorizeHttpRequests(authz -> authz
.requestMatchers(
"/api/mensagemsistema",
"/api/error-report",
"/api/metrics",
"/api/health"
).permitAll()
.requestMatchers("/api/**").authenticated()
)
;
configureFiltros(http);
return http.build();
}
Como eu informo ao Spring Boot / Security que a requisição, com os headers enviados, é autenticada?
No método configureFiltros parece estar havendo algum controle neste propósito, mas na verdade ele usa Filtros...
http.addFilterBefore(myFilter, UsernamePasswordAuthenticationFilter.class);
onde myFilter extende OncePerRequestFilter para nem passar pela validação do Spring Security:
- num conjunto específico de rotas (a mesma lista definida em requestMatchers), ou
- após fazer a validação do usuário / senha no SSO com sucesso;
Imagino se há uma forma de informar a autenticação com sucesso do SSO diretamente ao Spring Security sem passar por esse filtro?