6
respostas

Erro 400

Boa tarde pessoal, ao fazer o testes estou recebendo um erro 400 no Postmam e nenhuma mensagem de erro ?

sInformações de testes no Postamam

package br.com.alura.forum.controller;


import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import br.com.alura.forum.config.security.TokenService;
import br.com.alura.forum.controller.dto.TokenDTO;
import br.com.alura.forum.controller.form.LoginForm;

@RestController
@RequestMapping("/auth")
public class AutenticacaoController {

    @Autowired
    private AuthenticationManager authManager;

    @Autowired
    private TokenService tokenService;

    @PostMapping
    public ResponseEntity<TokenDTO> autenticar(@RequestBody @Valid LoginForm form){
        UsernamePasswordAuthenticationToken dadosLogin = form.converter();

        try {
            Authentication authentication = authManager.authenticate(dadosLogin);
            String token = tokenService.gereToken(authentication);
            return ResponseEntity.ok(new TokenDTO(token, "Bearer"));

        } catch (AuthenticationException e) {
            return ResponseEntity.badRequest().build();

        }



    }

}

SecurityConfiguration

package br.com.alura.forum.config.security;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

@EnableWebSecurity
@Configuration
public class SecurityConfigurations extends WebSecurityConfigurerAdapter {

    @Autowired
    private AutenticacaoService autenticacaoService;

    @Override
    @Bean
    protected AuthenticationManager authenticationManager() throws Exception {
        return super.authenticationManager();
    }

    //Configuracoes de autenticacao
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(autenticacaoService).passwordEncoder(new BCryptPasswordEncoder());
    }

    //Configuracoes de autorizacao
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
        .antMatchers(HttpMethod.GET, "/topicos").permitAll()
        .antMatchers(HttpMethod.GET, "/topicos/*").permitAll()
        .antMatchers(HttpMethod.POST, "/auth").permitAll()
        .anyRequest().authenticated()
        .and().csrf().disable()
        .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    }


    //Configuracoes de recursos estaticos(js, css, imagens, etc.)
    @Override
    public void configure(WebSecurity web) throws Exception {
    }

}
6 respostas

Ola Renato.

O status http 400 normalmente diz sobre os dados e formatos deles. Poderia enviar como está a classe LoginForm pra gente comparar com o JSON que você está enviando?

Fala JP, blz ! Estou mandando aqui meu código.

package br.com.alura.forum.controller.form;

import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;

public class LoginForm {

    private String email;
    private String senha;

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public UsernamePasswordAuthenticationToken converter() {
        return new UsernamePasswordAuthenticationToken(email, senha);
    }

}

Oi Renato,

Deve estar entrando nesse catch, no seu controller:

} catch (AuthenticationException e) {
    return ResponseEntity.badRequest().build();
}

Coloca um printStacktrace para ver no console o que está acontecendo:

} catch (AuthenticationException e) {
    e.printStacktrace();
    return ResponseEntity.badRequest().build();
}

Ola Renato.

Realmente está condizente a classe.

No entanto notei que é propositalmente lançado um erro 400 no try/catch do metodo autenticar no controller. Assim pode estar acontecendo algum erro interno, algo de banco ou outro codigo, e no final é lançado o 400.

Tente debugar pra achar o erro, ou entao coloca um log no catch pra tentar pegar a mensagem, pra gente ver se caiu ali mesmo.

catch (AuthenticationException e) {
   System.out.println("Ocorreu Erro Aqui");
   e.printStackTrace();   
   return ResponseEntity.badRequest().build();

}

Fala pessoal, boa tarde ! Desculpe a demora para retornar com esse tema, estou mandando aqui em baixo o print com o Trace de erro.

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

Pelo erro parece que a senha na sua tabela está em texto aberto e não no formato do BCrypt.