Пароли для регистрации и входа BCryptPasswordEncoder в Spring Security 6 не совпадают ⇐ JAVA
-
Anonymous
Пароли для регистрации и входа BCryptPasswordEncoder в Spring Security 6 не совпадают
Долго не могу решить задачу, много чего прочитал, так и не понял.
В общем, у меня есть форма регистрации пользователя (Thymeleaf), данные из нее передаются в контроллер, затем пароль хешируется и данные отправляются в базу данных через JPA.
но
При попытке войти у меня не проходит авторизация, якобы неправильный пароль.
При этом, если я хэширую пароль на каком-то сайте и вручную ввожу его в базу, то я могу войти позже.
То есть если хэш внесен в базу вручную, то я могу залогиниться. Если регистрация будет проходить через мое приложение, то авторизоваться я не смогу.
Хеш с сайта-генератора получен с помощью одной версии алгоритма, а хэш, который генерирует мое приложение, — с другой версией. Поэтому я не понимаю, как быть, если у меня на все приложение только один bean-компонент PasswordEncoder.
Хеш с сайта-генератора:
$2y$10$/mZ5HhyfMTml2xj0HYEX0uQfFgHDnsdJ3IhX0pReHUTRVSDuoqAPO
Хеш, сгенерированный моим приложением:
$2a$10$2U3MnmqMomhwWQpju1kuy.muBr7TPivlb.wn7XFilMAPJXlwaPx4.
Конфигурация безопасности
@Configuration @EnableWebSecurity @RequiredArgsConstructor общественный класс SecurityConfig { @Бин общественный UserDetailsService userDetailsService () { вернуть новый UserService(); } @Бин общественный PasswordEncoder парольEncoder () { вернуть новый BCryptPasswordEncoder(); } @Бин public SecurityFilterChain securityFilterChain(HttpSecurity http) выдает исключение { вернуть http .authorizeHttpRequests(аутентификация -> аутентификация .requestMatchers("/", "/css/**", "/js/**", "/images/**", "/candidate/**", "/setup/**").permitAll( ) .requestMatchers("/chat/**").hasAnyRole("ADMIN","HEAD","USER") .requestMatchers("/users/**").hasAnyRole("ADMIN","HEAD") .requestMatchers("/admin/**").hasAnyRole("АДМИН") .anyRequest().аутентифицированный() .formLogin((форма) -> форма .loginPage("/логин") .failureUrl("/login?error=true") .defaultSuccessUrl("/карты", true) .permitAll() .logout((выход) -> выход .logoutUrl("/выход") .logoutSuccessUrl("/логин") .deleteCookies("JSESSIONID") .invalidateHttpSession(истина) .clearAuthentication(истина) ) .строить(); } @Бин общественный DaoAuthenticationProvider аутентификацияПровидер () { DaoAuthenticationProvider authProvider = новый DaoAuthenticationProvider (); authProvider.setUserDetailsService(userDetailsService()); authProvider.setPasswordEncoder(passwordEncoder()); вернуть авторизованного поставщика; } } Контроллер регистрационной формы
@Controller @RequestMapping("/setup") класс НастройкаКонтроллер { @Autowired частный UserService userService; @Autowired частный RoleService roleService; @Autowired частный ПарольЭнкодер ПарольЭнкодер; @PostMapping("/create") public String setupUser (пользователь-пользователь) { пытаться { user.setPassword(passwordEncoder.encode(user.getPassword())); userService.save (пользователь); } catch(Исключение е) { System.out.println(e); return "redirect:/setup?error=true"; } вернуть «перенаправление:/логин»; } } Я пытался использовать это:
@Бин общественный PasswordEncoder парольEncoder () { вернуть новый BCryptPasswordEncoder(BCryptVersion.$2Y); } и попробовал SHA-256, но работает так же. Не могу войти после регистрации.
Также я пробовал использовать этот метод:
@Бин @Autowired public AuthenticationProvider аутентификацияProvider (UserDetailsService userDetailsService, PasswordEncoder) { DaoAuthenticationProvider authProvider = новый DaoAuthenticationProvider (); поставщик.setUserDetailsService(userDetailsService); поставщик.setPasswordEncoder(passwordEncoder); вернуть авторизованного поставщика; } но то же самое.
Долго не могу решить задачу, много чего прочитал, так и не понял.
В общем, у меня есть форма регистрации пользователя (Thymeleaf), данные из нее передаются в контроллер, затем пароль хешируется и данные отправляются в базу данных через JPA.
но
При попытке войти у меня не проходит авторизация, якобы неправильный пароль.
При этом, если я хэширую пароль на каком-то сайте и вручную ввожу его в базу, то я могу войти позже.
То есть если хэш внесен в базу вручную, то я могу залогиниться. Если регистрация будет проходить через мое приложение, то авторизоваться я не смогу.
Хеш с сайта-генератора получен с помощью одной версии алгоритма, а хэш, который генерирует мое приложение, — с другой версией. Поэтому я не понимаю, как быть, если у меня на все приложение только один bean-компонент PasswordEncoder.
Хеш с сайта-генератора:
$2y$10$/mZ5HhyfMTml2xj0HYEX0uQfFgHDnsdJ3IhX0pReHUTRVSDuoqAPO
Хеш, сгенерированный моим приложением:
$2a$10$2U3MnmqMomhwWQpju1kuy.muBr7TPivlb.wn7XFilMAPJXlwaPx4.
Конфигурация безопасности
@Configuration @EnableWebSecurity @RequiredArgsConstructor общественный класс SecurityConfig { @Бин общественный UserDetailsService userDetailsService () { вернуть новый UserService(); } @Бин общественный PasswordEncoder парольEncoder () { вернуть новый BCryptPasswordEncoder(); } @Бин public SecurityFilterChain securityFilterChain(HttpSecurity http) выдает исключение { вернуть http .authorizeHttpRequests(аутентификация -> аутентификация .requestMatchers("/", "/css/**", "/js/**", "/images/**", "/candidate/**", "/setup/**").permitAll( ) .requestMatchers("/chat/**").hasAnyRole("ADMIN","HEAD","USER") .requestMatchers("/users/**").hasAnyRole("ADMIN","HEAD") .requestMatchers("/admin/**").hasAnyRole("АДМИН") .anyRequest().аутентифицированный() .formLogin((форма) -> форма .loginPage("/логин") .failureUrl("/login?error=true") .defaultSuccessUrl("/карты", true) .permitAll() .logout((выход) -> выход .logoutUrl("/выход") .logoutSuccessUrl("/логин") .deleteCookies("JSESSIONID") .invalidateHttpSession(истина) .clearAuthentication(истина) ) .строить(); } @Бин общественный DaoAuthenticationProvider аутентификацияПровидер () { DaoAuthenticationProvider authProvider = новый DaoAuthenticationProvider (); authProvider.setUserDetailsService(userDetailsService()); authProvider.setPasswordEncoder(passwordEncoder()); вернуть авторизованного поставщика; } } Контроллер регистрационной формы
@Controller @RequestMapping("/setup") класс НастройкаКонтроллер { @Autowired частный UserService userService; @Autowired частный RoleService roleService; @Autowired частный ПарольЭнкодер ПарольЭнкодер; @PostMapping("/create") public String setupUser (пользователь-пользователь) { пытаться { user.setPassword(passwordEncoder.encode(user.getPassword())); userService.save (пользователь); } catch(Исключение е) { System.out.println(e); return "redirect:/setup?error=true"; } вернуть «перенаправление:/логин»; } } Я пытался использовать это:
@Бин общественный PasswordEncoder парольEncoder () { вернуть новый BCryptPasswordEncoder(BCryptVersion.$2Y); } и попробовал SHA-256, но работает так же. Не могу войти после регистрации.
Также я пробовал использовать этот метод:
@Бин @Autowired public AuthenticationProvider аутентификацияProvider (UserDetailsService userDetailsService, PasswordEncoder) { DaoAuthenticationProvider authProvider = новый DaoAuthenticationProvider (); поставщик.setUserDetailsService(userDetailsService); поставщик.setPasswordEncoder(passwordEncoder); вернуть авторизованного поставщика; } но то же самое.
Мобильная версия