Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

[Bug] Minha autenticação só retorna forbidden

Insira aqui a descrição dessa imagem para ajudar na acessibilidade Insira aqui a descrição dessa imagem para ajudar na acessibilidadeInsira aqui a descrição dessa imagem para ajudar na acessibilidade Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

6 respostas

Continuação dos Prints

Insira aqui a descrição dessa imagem para ajudar na acessibilidade Insira aqui a descrição dessa imagem para ajudar na acessibilidade

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.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

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

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

solução!

Resolvi o problema! Isso foi uma das maiores idiotices minha,esqueci de comitar o insert. Como uso Oracle esqueci desse fator primordial .