У меня в проекте есть ситуация «поймать 22», которую я не знаю, как решить.Это приложение создано на Spring MVC, где, как администратор, я могу создавать / обновлять пользователей.Теперь я использую BCryptPasswordEncoder для шифрования пароля созданного пользователя, который хранится в БД MySql.
Теперь проблема в том, что мы не можем декодировать зашифрованный пароль, зашифрованный с помощью BCryptPasswordEncoder.Напримертеперь я создал пользователя с паролем, скажем "SpringMVC @ #" после нажатия кнопки сохранения он зашифровывается кодировщиком, он становится примерно таким: "$ 2a $ 10 $ Cjcstw1UKZstCA19NiF4mOGMHMEMFojNozW5fH7qZ5RJ7Atz24I iss" 606G "isg6zполукоксовая сольТеперь я не могу расшифровать это значение и отобразить его как *************** (эквивалент SpringMVC @ # ) в поле пароля при обновлении.экран пользователя, вызывающий серьезную проблему.
При создании пользователя я вхожу в следующие поля: Имя пользователя, Пароль, Роль, Активный индикатор (это выпадающий список со значениями Y или N)
Теперь проблема заключается в том, что когда я перехожу на экран обновления, чтобы обновить сведения о пользователе, значение пароля выбирается из БД и отображается следующим образом:
Показанный здесь пароль на самом деле является зашифрованным / засоленным паролем длиной 60 символов, который выбирается из БД.Теперь проблема в том, что когда я обновляю одно поле (скажем, Роль) и нажимаю Отправить , он также обновляет пароль (который уже зашифрован) с двойным шифрованием, то есть значение снова засоляется и обновляется.И нет никакого способа узнать, какое значение хранится в БД после обновления.Поэтому, когда этот пользователь пытается снова войти в приложение, он не может указать, что его учетные данные неверны.
Вот код моего SecurityConfig.java файла, который расширяет WebSecurityConfigurerAdapter
@Autowired
DBAuthenticationService DBAauthenticationService;
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(dbAauthenticationService).passwordEncoder(passwordEncoder());
}
@Bean
public PasswordEncoder passwordEncoder() {
PasswordEncoder encoder = new BCryptPasswordEncoder();
return encoder;
}
Вот фрагмент кода из UserController.java:
@RequestMapping(value = "/saveUser", method = RequestMethod.POST)
public ModelAndView saveUsersData(@ModelAttribute @Valid USerModel model, BindingResult result) {
if (!result.hasErrors()) {
try {
String roleUser = model.getUserRole();
model.setPassWord(pwEncode.encode(model.getPassWord()));
userDao.saveUsersData(model, getUserId(), roleUser);
userDao.setIsNewRecord(false);
return new ModelAndView("redirect:/userListPage");
} catch (Exception ex) {
//print
}
}
return new ModelAndView("addUser");
}
Теперь мои запросы:
1) В любом случае я могу декодировать зашифрованный пароль БД?ИЛИ ЖЕ2) Есть ли другой способ обойти эту проблему?