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

Autenticando o cliente via Spring Security

Olá comunidade Alura!

Possuo uma dúvida referente a parte de cadastrar um novo usuário na base de dados e logo após isso realizar o processo de login, isso seria feito na classe AutenticacaoService? Uma vez que essa classe possui um método que verifica se o usuário existe na base de dados, teria alguma forma verificar se o usuário existe ou não e logo após realizar o processo de cadastro passando os dados no JSON? Grato!

4 respostas

Oi José,

Pode ser feito na classe AutenticacaoService mesmo, após verificar que o usuário não existe realiza o cadastro com as informações que forem passadas no json.

Olá Rodrigo!

Primeiramente muito obrigado pela resposta.

Tenho mais uma dúvida a parte de encriptação da senha do usuário eu posso usar a própria classe BCryptPasswordEncoder para realizar o processo de encriptação, na própria classe AutenticacaoService? Irei deixar o código de exemplo da minha ideia e gostaria de saber se está correto em termos de padrões (As classes são AutenticacaoService e CadastrarUsuarioController).

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

import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service;

import br.com.alura.forum.modelo.Usuario; import br.com.alura.forum.repository.UsuarioRepository;

@Service public class AutenticacaoService implements UserDetailsService {

@Autowired
private UsuarioRepository usuarioRepository;

@Autowired
private PasswordEncoder encoder;

@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!");
}

public UserDetails cadastrarUsuario(Usuario usuario) throws UsernameNotFoundException {
    Optional<Usuario> user = usuarioRepository.findByEmail(usuario.getEmail());

    if(user.isEmpty()) {
        Usuario u = new Usuario();
        u.setEmail(usuario.getEmail());
        u.setNome(usuario.getNome());
        u.setSenha(encoder.encode(usuario.getSenha()));
        usuarioRepository.save(u);
        return u;
    }    
    throw new UsernameNotFoundException("Usuário existente");
}

} ` Classe CadastrarUsuarioController que criei e nessa classe injetei o serviço de autenticação para ter acesso ao método de cadastrar usuário.

package br.com.alura.forum.controller;

import javax.transaction.Transactional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
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.AutenticacaoService;
import br.com.alura.forum.modelo.Usuario;

@RestController
@RequestMapping("/cadastrar")
public class CadastrarUsuarioController {

    @Autowired
    private AutenticacaoService autenticacaoService;

    @PostMapping
    @Transactional
    public ResponseEntity<UsuarioDto> cadastrarUsuario(@RequestBody UsuarioDto usuarioDto) {
        Usuario user = usuarioDto.converter();

        autenticacaoService.cadastrarUsuario(user);
        return ResponseEntity.ok(new UsuarioDto(user));
    }
}

Grato!

Oi José,

Sim, você pode fazer esse processo também nessa classe service, antes de salvar o novo usuário no banco.

Bons estudos!

solução!

Olá Rodrigo!

Muito obrigado pela resposta dessa forma agora consigo cadastrar um novo usuário e e encriptar a senha do mesmo.

Grato!