Boa noite!
Complementei a prática desenvolvida no curso "Spring Boot 3: aplique boas práticas e proteja uma API Rest" para além do Endpoint de Longin , ter o endpoint de cadastro de usuário.
Por gentileza avaliar se o código pode ser melhorado, segue fonte para avaliação. Obs. Usei Objeto Record ( UserAuthenticationData) para receber os dados do usuário a ser cadastrado, por que essa entrada precisa ser imutável. Já para inserir no banco uso o DTO Lombok (User), já que o atributo password será modifcado para ser enviado criptografada.
/**
* @author Aline Divino
*
*/
@RestController
@RequestMapping("/login")
public class AutenticationController {
/*
* Inject Spring Class that triggers the Authentication process
*/
@Autowired
private AuthenticationManager authenticationManager;
@Autowired
private TokenService tokenService;
@Autowired
private UserRepository userRepository;
@Autowired
private BCryptPasswordEncoder bCryptPasswordEncoder;
@PostMapping
public ResponseEntity<JWTTokenData> loginIn(@RequestBody @Valid UserAuthenticationData userData) {
Authentication authenticationToken =
new UsernamePasswordAuthenticationToken(userData.login(), userData.pass());
Authentication authenticate = authenticationManager.authenticate(authenticationToken);
String tokenJwt = tokenService.generateToken((User) authenticate.getPrincipal());
return ResponseEntity.ok(new JWTTokenData(tokenJwt));
}
@PostMapping("/new")
@Transactional
public ResponseEntity<?> newUser(@RequestBody @Valid UserAuthenticationData json, UriComponentsBuilder uriBuilder) {
User user = new User();
String encriptedPasswd = bCryptPasswordEncoder.encode(json.pass());
user.setLogin(json.login());
user.setPass(encriptedPasswd);
userRepository.save(user);
return ResponseEntity.ok().build();
}
}