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

Dúvida autenticação

Olá Rodrigo.

No caso do método autenticar:

    @PostMapping
    public ResponseEntity<?> autenticar(@RequestBody @Valid LoginForm form) {
        UsernamePasswordAuthenticationToken authReq = form.converter();
        try {
            Authentication authentication = authManager.authenticate(authReq);
            String token = tokenService.gerarToken(authentication);
            return new ResponseEntity<>(new TokenDTO(token, "Bearer"), HttpStatus.OK);
        } catch (AuthenticationException e) {
            return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
        }
    }

Você poderia me explicar como que ocorre a autententicação do usuário através do método authenticate(authReq)? Pois authManager é apenas uma interface, logo não entendi sobre como o Spring busca pela implementação deste método. Nesse caso, a implementação seria na classe AutenticacaoService, no método loadUserByUsername(String username) ?

Obrigada :)

3 respostas
solução!

Isso mesmo Caroline,

Na classe de configurações de segurança fizemos essa configuração:

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

E com isso o Spring sabe que quando for chamado o método authManager.authenticate(authReq) é para delegar para a nossa classe AutenticacaoService o processo de autenticação.

Bons estudos!

Rodrigo, nesta linha:

Authentication authentication = authManager.authenticate(authReq);

Esperamos receber um objeto da classe Authentication, mas, como vc disse que delegamos esta chamada ao método:

@Override
 public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        Optional<Usuario> usuario = usuarioRepository.findByEmail(username);
        if(usuario.isPresent()){
            return usuario.get();
        }
        throw new UsernameNotFoundException("Dados inválidos!");
    }

Porém este método retorna UserDetails, diferente do Authentication esperado. Aonde que ocorre essa transformação de um objeto para outro?

Obrigada.

Oi Caroline,

Internamente o Spring chama o loadUserByUsername, da classe service, e depois faz uma outra parte do processo que também envolve a criação do objeto Authentication, que encapsula o UserDetails.

Por isso o retorno é um objeto do tipo Authentication, mas internamente foi chamado o loadUserByUsername e guardado o objeto UserDetails.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software