Realizei algumas alterações para que conseguisse utilizar o banco h2 porém fico com erro forbidden e não é gerado nenhum erro no console
@Configuration
@EnableWebSecurity
public class SecurityConfigurations {
@Autowired
private SecurityFilter securityFilter;
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http.csrf(
csrf -> csrf.ignoringRequestMatchers(AntPathRequestMatcher.antMatcher("/h2-console/**")))
.sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.authorizeHttpRequests(req -> {
req.requestMatchers(HttpMethod.POST, "/login").permitAll();
req.requestMatchers(AntPathRequestMatcher.antMatcher("/h2-console/**")).permitAll();
req.anyRequest().authenticated();
})
.headers(headers -> headers.frameOptions().disable())
.addFilterBefore(securityFilter , UsernamePasswordAuthenticationFilter.class)
.build();
}
@Bean
public AuthenticationManager authenticationManager(AuthenticationConfiguration configuration) throws Exception{
return configuration.getAuthenticationManager();
}
@Bean
public PasswordEncoder passwordEncoder () {
return new BCryptPasswordEncoder();
}
}
@Component
public class SecurityFilter extends OncePerRequestFilter {
@Autowired
private TokenService tokenService;
@Autowired
private UserRepository repository;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
var tokenJWT = recuperarToken(request);
if (tokenJWT != null) {
var subject = tokenService.getSubject(tokenJWT);
var usuario = repository.findByLogin(subject);
var authentication = new UsernamePasswordAuthenticationToken(usuario, null, usuario.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authentication);
}
filterChain.doFilter(request, response);
}
private String recuperarToken(HttpServletRequest request) {
var authorization = request.getHeader("Authorization");
if (authorization != null ) System.out.println(authorization);
return null;
}
}
@RestController
@RequestMapping("/login")
public class AuthenticationController {
@Autowired
private AuthenticationManager manager;
@Autowired
private TokenService tokenService;
@PostMapping
public ResponseEntity<DadosToken> login (@RequestBody @Valid AuthenticationDTO dados) {
var authenticationToken = new UsernamePasswordAuthenticationToken(dados.login(), dados.password());
var authentication = manager.authenticate(authenticationToken);
var tokenJWT = tokenService.token((User) authentication.getPrincipal());
return ResponseEntity.ok(new DadosToken(tokenJWT));
}
}