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

Erro em authManager.authenticate();

No try catch tá sempre indo pro catch.. rsrs Alguém pode ajudar?

No caso após a linha do authManager.authenticate() ele já dá erro, mas não sei pq...

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

    @Autowired
    private AuthenticationManager authManager;

    @Autowired
    private TokenService tokenService;

    @PostMapping
    public ResponseEntity<?> authenticate(@RequestBody @Valid LoginForm form) {

        UsernamePasswordAuthenticationToken loginData = form.convertToUsernamePasswordAuthToken();

        try {
            Authentication authentication = authManager.authenticate(loginData);
            String token = tokenService.generateToken(authentication);
            System.out.println(token);

            return ResponseEntity.ok().build();
        } catch (AuthenticationException e) {
            System.out.println("ERRO 400");

            return ResponseEntity.badRequest().build();
        }

    }

O fato de eu não estar usando o email mas sim o CPF que chamo de idNumber, pode gerar esse erro?

public class LoginForm {

    private String idNumber;
    private String password;


    public String getIdNumber() {
        return idNumber;
    }

    public String getPassword() {
        return password;
    }

    public void setIdNumber(String idNumber) {
        this.idNumber = idNumber;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public UsernamePasswordAuthenticationToken convertToUsernamePasswordAuthToken() {
        return new UsernamePasswordAuthenticationToken(idNumber, password);
    }
}
7 respostas

A Classe que implementa UserDetails

@Entity
public class Customer implements UserDetails {

    private static final long serialVersionUID = 1L;

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String firstName;
    private String lastName;
    private String idNumber;
    private String address;
    private String occupation;
    private String password;

    @ManyToMany(fetch = FetchType.EAGER)
    private List<UserProfile> profiles = new ArrayList<>();

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "account_id", referencedColumnName = "id")
    private Account account;

    public Customer() {
    }

    public Customer(String firstName, String lastName, String idNumber, String address,
            String occupation) {

        this.firstName = firstName;
        this.lastName = lastName;
        this.idNumber = idNumber;
        this.address = address;
        this.occupation = occupation;
    }

    public Customer(String firstName, String lastName, String idNumber, String address,
            String occupation , Account account) {

        this.firstName = firstName;
        this.lastName = lastName;
        this.idNumber = idNumber;
        this.address = address;
        this.occupation = occupation;
        this.account = account;
    }


    public Long getId() {
        return this.id;
    }

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return this.lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getIdNumber() {
        return this.idNumber;
    }

    public void setIdNumber(String idNumber) {
        this.idNumber = idNumber;
    }

    public String getAddress() {
        return this.address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getOccupation() {
        return this.occupation;
    }

    public void setOccupation(String occupation) {
        this.occupation = occupation;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Account getAccount() {
        return this.account;
    }

    public void generateAccount(String number, String branch, BigDecimal balance, AccountType accountType) {
        Account generatedAccount = new Account(number, branch, balance, accountType);

        this.account = generatedAccount;

        generatedAccount = null;
    }

    public void changeAccountType(AccountType accountType) {

        if (account != null)
        account.setAccountType(accountType);
    }

    @Override
    public String toString() {
        return this.firstName + " " + this.occupation;
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return this.profiles;
    }

    @Override
    public String getPassword() {
        return this.password;
    }

    @Override
    public String getUsername() {
        return this.idNumber;
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }

}

Oi Arthur,

Acho que não tem problema o seu atributo ser o IdNumber.

Poste aqui o código da sua classe AutenticacaoService.

@Service
public class AuthenticationService implements UserDetailsService{

    @Autowired
    private UserProfileRepository userProfileRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        Optional<Customer> customer = userProfileRepository.findByIdNumber(username);

        if (customer.isPresent()) {
            return customer.get();
        } 

        throw new UsernameNotFoundException("Invalid data for username");
    }

}

Tava dando uma olhada e talvez o problema esteja nesse Optional, porém não sei como resolver isso, mas ele está retornando empty no console :/

public interface UserProfileRepository extends JpaRepository<Customer, Long> {

    Optional<Customer> findByIdNumber(String idNumber);

}
solução!

Desculpa tomar o tempo do senhor, foi pura desatenção minha. O código estava perfeito porém eu estava chamando o idNumber errado no postman!! kkk

Porém foi bom pq segui com a dúvida sobre o optional.

trocando essa função:

 Optional<Customer> findByIdNumber(String idNumber);

por essa:

Customer findByIdNumber(String idNumber);

também funciona.. Quais seriam as diferenças de chamar de cada forma?

Ah blz!

Bom que percebeu o detalhe :)

O Optional é um recurso do Java 8 para evitar obejtos null, deixando o código com menos if/else.

Aí fica a seu critério qual alternativa utilizar, pois ambos os casos vão gerar o mesmo resultado.

Bons estudos!

Show, obrigado!