Przechowywanie haseł użytkowników używanych w aplikacji

0

Tworzę system logowania do mojej aplikacji i przeczytałem gdzieś że haseł nie powinno przechowywać się w bazie danych. Dodałem więc adnotację @transient i hasło się nie zapisuje. Problem polega na tym że teraz pisząc logikę logowania nie za bardzo wiem skąd to hasło wziąć aby zweryfikować użytkownika. Zastanawiam się czy szyfrowanie hasła przy zapisie nie byłoby wystarczające. Czy mógłby mi ktoś przybliżyć temat i wytłumaczyć jak to właściwie powinno wyglądać albo podesłać materiały poruszające ten temat?

@Entity
@Table(name = "customers")
public class Customer implements VerificableUser {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id_customer")
    private Integer id;

    @Column(nullable = false, unique = true)
    @NotEmpty(message = "please provide login")
    private String login;

    @Column(nullable = false)
    @NotEmpty()
    private String role;

    @Column(nullable = false)
    @NotEmpty(message = "please provide first name")
    private String firstName;

    @Column(nullable = false)
    @NotEmpty(message = "please provide last name")
    private String lastName;

    @Transient
    private String password;

    @Column(nullable = false, unique = true)
    @Email(message = "please provide valid email")
    private String email;

    public Customer() {
        this.role = "Customer";
    }

    //gettery i settery    
}
@Service
public class CustomerService {

    CustomerRepo customerRepo;

    @Autowired
    CustomerService(CustomerRepo customerRepo){
        this.customerRepo = customerRepo;
    }

    public void saveCustomer(Customer customer){
        customerRepo.save(customer);
    }

    public Customer getCustomer(String login){
        return customerRepo.findByLogin(login);
    }

    public boolean verifyCustomer(String login, String password) {
        VerificableUser verificableUser = customerRepo.findByLogin(login);
        if(verificableUser.getPassword() == password) return true;
        else return false;
    }
}
7

przeczytałem gdzieś że haseł nie powinno przechowywać się w bazie danych.

A gdzie ma się przechowywać? :D :D :D
Powinno się ale nie jawnie/kodowane tylko hashowane np. z użyciem BCrypt
Tzw. Salt albo Pepper dodatkowo zwiększają bezpieczeństwo

Poza tym:

(verificableUser.getPassword() == password)

Najpierw radze nauczyć się Javy.

2

W klasie konfiguracyjnej stwórz beana do Bcrypta

   @Bean
    PasswordEncoder createPasswordEncoder(){
        return new BCryptPasswordEncoder();
    }

Jeżeli jakiś serwis będzie potrzebować funkcji hashowania hasła, po porostu wstrzykujesz.

@Service
class CustomerService {

 private final PasswordEncoder passwordEncoder;

    CustomerService(PasswordEncoder passwordEncoder){
        this.passwordEncoder = passwordEncoder;
    }

    boolean verifyCustomer(String login, String rawPassword) {
       User user = customerRepo.findByLogin(login).orElseThrow(NotFoundException::new);
       return passwordEncoder.matches(rawPassword, user.getPassword());
    }

Pewnie używasz nową wersję springa to nie potrzebujesz nad konstruktorem adnotacji @Autowired

    @Column(name = "id_customer") -> nie wystarczy w bazie po prostu id? 
    private Integer id;

  @Column(nullable = false)
    private String role;  -> Może warto było by użyć enuma   
    @NotEmpty(message = "please provide first name") 
    private String firstName;

Nie wiem jak inni ale ja staram się unikać walidacji na poziomie samego zapisu do bazy(Napiszcie swoje refleksje :) ). Raczej wolał bym wykonać walidacje jak najwcześniej (controller)

@Transient -> Jeżeli zrobisz osobne typy we warstwach nie będziesz potrzebował tej adnotacji.
   void saveCustomer(CreateCustomerDto createCustomerDto){
       customerRepo.save( Customer.builder()
.nick(createCustomerDto.getNick())
......build())
    }

1 użytkowników online, w tym zalogowanych: 0, gości: 1