Continuação dos Prints
Já olhei diversas vezes, e tentei até colocar na config
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http.csrf()
.disable() // desabilita cnotra atqs de cross site request foreign, o token já é uma proteção
.authorizeHttpRequests().requestMatchers(HttpMethod.POST, "/login").permitAll()
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.build();
}
mas foi em vão, continua com a mesma mensagem de proibição. Fico no aguardo de uma solução.
Oi João!
Deve estar acontecendo alguim outro erro e a API devolve 403 por conta do Spring Security.
Coloca um try/catch no controller para ver se ocorre exception:
try {
var authenticationToken = new UsernamePasswordAuthenticationToken(autenticacao.login(), autenticacao.senha());
var authentication = authenticationManager.authenticate(authenticationToken);
} catch (Exception e) {
e.printStackTrace();
}
return ResponseEntity.status(HttpStatus.OK).build();
De fato, após colocar uma exception retornou uma exception de Autenticação. UserDetailsService returned null, which is an interface contract violation.
Fiz mais alguns testes para entender o problema e quando o parâmetro é inserido no método UserDetails loadUserByUsername(String username) após a requisição ao banco ele retorna null. Entretanto meu banco está populado com esse usuário, até fiz uma consulta nativa para ver se me devolvia algo, coloquei trim no login para eliminar algum espaço caso tivesse, depois fiz update e mesmo assim continua retornando null. Enfim, se tiver mais alguma alternativa para me ajudar agradeço, estou meio perdido daqui. Segue os códigos abaixo das minhas tentativas. PS: uso banco ORACLE, mas creio que não é esse o problema.
package com.softmed.api.security.model;
import java.util.Collection;
import java.util.List;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.SequenceGenerator;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
@Entity(name = "USUARIO")
@Table(name = "USUARIO")
@Getter
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of = "id")
public class Usuario implements UserDetails{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "usuario_seq")
@SequenceGenerator(name = "usuario_seq", sequenceName = "USUARIO_SEQ", allocationSize = 1, schema = "SOFTMEDDB")
private Long id;
@Column(name = "LOGIN", length = 50, nullable = false, unique = true)
private String login;
@Column(name = "SENHA", length = 500)
private String senha;
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return List.of(new SimpleGrantedAuthority("ROLE_USER"));
}
@Override
public String getPassword() {
return senha;
}
@Override
public String getUsername() {
return login;
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
}
Banco com o usuário registrado
Resolvi o problema! Isso foi uma das maiores idiotices minha,esqueci de comitar o insert. Como uso Oracle esqueci desse fator primordial .