Нужно устанвить salt для ShaPasswordEncoder, но не очень понятен принцип взаимодействия с классом MessageDigestPasswordEncoder.
Если я все правильно понял то salt это префикс который добавляется к строке перед тем как вычислять для нее hash. У него есть метод:
String encodePassword(String rawPass, Object salt)
И тут все понятно какую строку пошлем вторым параметром такой префикс и добавится при хешировании, но вероятно при конфигурации Spring Security я делаю это в методе:
void configure(HttpSecurity http)
Необходимо указать что при хешировании мы будем использовать соответстующий префикс, но у ShaPasswordEncoder нет конструктора или сеттера с помощью которого можно было бы указать какой salt я хочу использовать.
Вот метод который инициализирует AuthenticationProvider и ShaPasswordEncoder соответственно:
@Bean
public AuthenticationProvider authenticationProvider() {
DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
authenticationProvider.setUserDetailsService(userDetailsService);
authenticationProvider.setPasswordEncoder(new ShaPasswordEncoder());
return authenticationProvider;
}
И в методе configure я его добавляю :
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/rest/user/login").permitAll();
http.csrf().disable()
.authenticationProvider(authenticationProvider())
...
}
@Override
protected void configure(AuthenticationManagerBuilder auth) {
auth.authenticationProvider(authenticationProvider());
}
Может быть мне нужно делать это в моей имплементации UserDetailsService?
@Override
public UserDetailsImpl loadUserByUsername(final @NonNull String username) {
final User user = userService.getUserByUsername(username);
if (user == null) {
throw new UsernameNotFoundException(username);
}
List<GrantedAuthority> authorities = user.getRoles()
.stream().map(Role::getRole).collect(toList())
.stream().map(SimpleGrantedAuthority::new).collect(toList());
return new UserDetailsImpl(user, authorities);
}
Но он всроде бы работает только с username и к шифруемому паролю отношения не имеет. Есть SaltSource который вроде для этого и предназначен, но не понятно как в данном контексте его можно использовать.
Как мне в таких условиях специфицировать ShaPasswordEncoder для работы с моим salt, "my-sha-value" на пример. И главное, что в моих рассуждениях не верно, из за чего мне не найти возможность специфицировать salt?
В зависимостях использую стартер spring-boot-starter-security 1.5.9.
Спасибо.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости