20
Июл
2021

Spring Security Как получить username из PasswordEncoder?

Во время добавления нового юзера, я сохраняю его пароль в базе, в виде SHA256(cleartext_password + salt), значение salt сохраняю рядом в отдельную колонку для каждого юзера. Соответственно, проверка пароля должна выполняться следующим образом: вытаскиваем клеартекст пароля из BasicAuth заголовка, достаем из БД значение salt для этого логина, применяем SHA256(cleartext_password + salt), проверяем, что получившаяся строка и строка, хранящаяся в БД совпали. Для того чтобы это реализовать, я хочу создать костомный PasswordEncoder, в котором буду выполнять проверку, но в него Не приходит username, по которому я мог бы вытащить salt для этого юзера, которая нужна для проверки. Как можно выйти из этой ситуации?

Вот текущая реализации Security:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    private final UserDetailsService customUserDetailsService;

    public SecurityConfig(UserDetailsService customUserDetailsService) {
        this.customUserDetailsService = customUserDetailsService;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf().disable()
                .authorizeRequests()
                .requestMatchers(EndpointRequest.toAnyEndpoint()).permitAll()
                .anyRequest().authenticated()
                .and().httpBasic();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(customUserDetailsService)
        .passwordEncoder(new CustomPasswordEncoder());
    }

}

@Component
public class CustomUserDetailsService implements UserDetailsService {
    private final UserRepository userRepository;

    public CustomUserDetailsService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userRepository.findByUserName(username);
        if (user != null) {
            return org.springframework.security.core.userdetails.
                    User.withUsername(username)
                    .password(new CustomPasswordEncoder().encode(user.getPassword()))
                    .roles("USER")
                    .build();
        }
        throw new IllegalArgumentException();
    }
}

public class CustomPasswordEncoder implements PasswordEncoder {

    @Override
    public String encode(CharSequence rawPassword) {
        return rawPassword.toString();
    }

    @Override
    public boolean matches(CharSequence rawPassword, String encodedPassword) {
        String sha256hex = DigestUtils.sha256Hex(rawPassword.toString()); // Здеь должно быть DigestUtils.sha256Hex(rawPassword.toString() + salt)
        return sha256hex.equals(encodedPassword);
    }

}

Источник: https://ru.stackoverflow.com/questions/1306945/spring-security-%D0%9A%D0%B0%D0%BA-%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C-username-%D0%B8%D0%B7-passwordencoder

Тебе может это понравится...

Добавить комментарий