Как сделать так, что бы пароль автоматически шифровался в виде 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 шт):
Так почему бы просто не использовать 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);
}
}