Spring boot - walidacja hasła oraz szyfrowanie

0

Witam,
macie może jakieś pomysły w jaki sposób przeprowadzić walidację hasła aby nie gryzła się ona z jego zaszyfrowaniem? Kiedy zapisuję użytkownika do bazy danych, następuje walidacja formularza, który wypełnił użytkownik aby sprawdzić czy podane dane są poprawne. Jest tutaj też walidacja hasła, czyli sprawdzenie czy hasło ma od 5 do 30 znaków, duże litery itd. Wszystko ładnie działa. Ale kiedy dodałem jeszcze szyfrowanie hasła to już się wszystko sypie. Bo hasło musi zostać zaszyfrowane zanim zostanie wpisane do bazy, czyli przed całą walidacją.
I tutaj jest cały problem, bo zaszyfrowane hasło ma większą ilość znaków od tej której wymaga się od użytkownika i niestety to nie przechodzi.

2

W sensie gdzie masz tą walidacje? W bazie danych? Bo jeśli walidujesz normalnie zaraz po dostaniu danych a jeszcze przed jakimiklwiek operacjami na nich, to nie powinno być problemu.

0

Posiadam encje Uzytkownik, w której przeprowadzane są walidacje.

@Entity
@Table(name = "uzytkownicy")
public class Uzytkownik implements Serializable{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id_uzytkownika;
    
    @Column(nullable = false)
    private Integer id_roli;
    
    @Column(nullable = false)
    @Size(min = 3, max = 20, message = "Login musi mieć od 3 do 20 znaków")
    private String login;
    
    @Column(nullable = false)
    @ValidPassword
    private String haslo;
}

Klasa obsługująca walidację hasła wygląda następująco:

public class PasswordConstraintValidator implements ConstraintValidator<ValidPassword, String> {
    @Override
    public void initialize(ValidPassword arg0){
        
    }
    
    
    @Override
    public boolean isValid(String haslo, ConstraintValidatorContext context){
        Properties properties = new Properties();
        try{
            properties.load(new FileInputStream("cukiernia/messages.properties"));
        }
        catch(Exception e){
        }
        MessageResolver resolver = new PropertiesMessageResolver(properties);
        
        PasswordValidator validator = new PasswordValidator(resolver, Arrays.asList(
            new LengthRule(5, 30),
            new CharacterRule(EnglishCharacterData.UpperCase, 1),
            new CharacterRule(EnglishCharacterData.LowerCase, 1),
            new CharacterRule(EnglishCharacterData.Digit, 1),
            new CharacterRule(EnglishCharacterData.Special, 1),
            new WhitespaceRule()
        ));
        RuleResult result = validator.validate(new PasswordData(haslo));

        if(result.isValid()){
            return true;
        }
        List<String> bledy = validator.getMessages(result);
        
        String bladTemplate = bledy.stream().collect(Collectors.joining(". "));
        context.buildConstraintViolationWithTemplate(bladTemplate).addConstraintViolation().disableDefaultConstraintViolation();
        return false;
    }
}

A to jest metoda, która dodaje użytkownika do bazy danych.

public void addUzytkownik(Uzytkownik uzytkownik){
        Optional<Uzytkownik> uzytkownik_z_bazy = uzytkownikRepo.findByLogin(uzytkownik.getLogin());
        if(uzytkownik_z_bazy.isPresent()){
            System.out.println("Taki użytkownik już istnieje!");
        }
        
        else{
            //uzytkownik.setHaslo(encoder.encode(uzytkownik.getHaslo()));
            uzytkownik.setHaslo(new BCryptPasswordEncoder().encode(uzytkownik.getHaslo()));
            uzytkownik.setCzy_aktywne(Boolean.FALSE);
            uzytkownik.setId_roli(1);
            uzytkownikRepo.save(uzytkownik);
        }
    }

I chodzi o to, że cała ta walidacja dzieje się po wywołaniu metody save, czyli hasło jest już wtedy zaszyfrowane i dlatego walidacja nie przechodzi. A później nie mogę zaszyfrować tego hasła, bo do bazy zostanie zapisane już hasło, które użytkownik wpisał, bez żadnego szyfrowania.

2

1)Encje JPA nie powinny wychodzić do weba i odwrotnie
2)Dlaczego chcesz stosowac jakieś dziwne triki z adnotacjami zamiast jak człowiek zrobić po prostu obiekt czy metode do walidacji i tam sprawdzić czy hasło jest poprawne? O ile adnotacje tpyu notnull zrozumiem w JPA potencjalnie, to jeśli istnieje możliwość zrobienia czegoś łatwo bez adnotacji i refleksji to wole bez adnotacji i refleksji. Już trochę pracuje w tym IT, a teraz jestem na utrzymaniu produktu. Uwierz mi, debugowanie systemów nawalonych adotacjami nie jest fajne.

3

Waliduje się na poziomie inputu od użytkownika a nie na poziomie JPA. Jak przychodzi ci DTO do kontrolera to walidujesz dane tam!

0

Czyli najlepiej tą walidację zrobić po stronie html w inputach formularza, tak?

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