Как сделать так, что бы пароль автоматически шифровался в виде 12-символьной строки?

В данный момент при добавлении нового пользователя в БД через html-форму в Бд пароль записывается таким, каким я его указал в форме, но можно ли как-то сделать так, что бы пароль сразу попадал в БД в зашифрованном виде?

Как лучше всего это можно организовать в простом crud-приложении написанном на spring MVC + security + hibernate + thymeleaf?

Большинство примеров написаны с использованием xml-файлов (либо я плохо искал), а до меня в данный момент не доходит, как прикрутить это дело на javaConfig.

ссылка на гит-репозиторий

Бин BCryptPasswordEncoder`a и работающий с ним автовайред

    @Bean
    public BCryptPasswordEncoder bCryptPasswordEncoder() {
        return new BCryptPasswordEncoder(12);
    }

    @Autowired
    protected void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userService).passwordEncoder(bCryptPasswordEncoder());
    }

html-форма добавления юзера

<form action="#" th:action="@{addUser}" th:object="${user}" method="post">
    <label for="name">Name</label>
    <input type="text" th:field="*{name}" id="name" placeholder="Name">
    <span th:if="${#fields.hasErrors('name')}" th:errors="*{name}"></span>

    <label for="password">Password</label>
    <input type="text" th:field="*{password}" id="password" placeholder="Password">
    <span th:if="${#fields.hasErrors('password')}" th:errors="*{password}"></span>

    <label for="email">Email</label>
    <input type="text" th:field="*{email}" id="email" placeholder="Email">
    <span th:if="${#fields.hasErrors('email')}" th:errors="*{email}"></span>
    
    <input type="submit" value="Add User">
</form>

контроллеры добавления нового пользователя

    @GetMapping
    public ModelAndView showRegistrationForm(User user) {
        ModelAndView modelAndView = new ModelAndView("reg");
        modelAndView.addObject("user", user);
        return modelAndView;
    }

    @PostMapping("/newUser")
    public String createUser(User user) {
        user.getRoleSet().add(roleService.getDefaultRole());
        userService.addUser(user);
        return "redirect:/index";
    }

p.s. метод addUser вызывает метод addUser в сервисе, а тот в свою очередь реализован с помощью JPA (save(user))


Ответы (1 шт):

Автор решения: Stan

Так почему бы просто не использовать BCryptPasswordEncoder?

@Service
@Transactional(readOnly = true)
public class UserService implements UserDetailsService {
    private final UserRepo userRepo;
    private final PasswordEncoder passwordEncoder;

    public UserService(UserRepo userRepo, @Lazy PasswordEncoder passwordEncoder) {
        this.userRepo = userRepo;
        this.passwordEncoder = passwordEncoder;
    }

    @Transactional
    public User save(User user) {
        user.setPassword(passwordEncoder.encode(user.getPassword()));
        return userRepo.save(user);
    }
}
→ Ссылка