Вам нужен
CustomAuthenticationProvider, а не CustomUserDetails. Там делегируются права (role) пользователям при аутентификации.
Вот это вот лишнее:
@PostMapping("/process_register")
public String processRegister(User user) {
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String encodedPassword = passwordEncoder.encode(user.getPassword());
user.setPassword(encodedPassword);
user.setRole("USER");
userRepo.save(user);
return "register_success";
}
Возможно имеет смысл в экспериментальных (в учебных) целях, но на практике это лишнее... PasswordEncoder достаточно добавить 1 раз через RegisterGlobalAuthentication в классе WebSecurityConfig; а также добавив соответствующий бин:
@Bean
public PasswordEncoder pass(){
return new BCryptPasswordEncoder();
}
После регистрации, если она прошла успешно, обычно делается autoLogin через
SecurityContextHolder и
return "redirect:/index";
Если вы хотите шифровать данные в БД, то имеет смысл вынести BCryptPasswordEncoder() в глобальную переменную (в
final поле) на уровне класса - контроллера.
Смысл PasswordEncoder() в Spring Security заключается в том, что на время сессии создаётся "хэш-отпечаток" (цифровая подпись) кроме прочей информации в памяти... Его в принципе невозможно декодировать не зная реальный пароль и правила преобразования. Поэтому без него Spring Security и не работает.
Вот
старая модель CHA-1 кодирования в соответствии со спецификацией
Oracle к PasswordEncoder. А
BCryptPasswordEncoder использует более новые и более продуманные алгоритмы.