Что контролирует шифрование пароля в DaoAuthenticationProvider?

#spring-security

Вопрос:

Я получаю org.springframework.безопасность.аутентификация.Исключение BadCredentialsException, когда я пытаюсь войти в свое веб-приложение.

В моей конфигурации xml

 <authentication-manager>
    <authentication-provider ref="authProvider"/>
</authentication-manager>

<beans:bean id="authProvider" class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
    <beans:property name="userDetailsService" ref="userDetailsService" />
    <beans:property name="passwordEncoder" ref="passwordEncoder" />
</beans:bean>

<beans:bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder">
    <beans:constructor-arg name="strength" value="11" />
</beans:bean>

<beans:bean id="userDetailsService"
    class="com.kable.web.hub.service.impl.UserDetailsServiceImpl" />
 

Вы можете видеть, что кодер пароля предоставлен поставщику авторизации. Я проверил, что зашифрованный пароль хранится в базе данных и извлекается пользователем UserDetailsServiceImpl следующим образом.

 @Override
public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException {
    logger.debug(String.format("loadUserByUsername %s", userName));
    User user = userService.get(userName);
    if (user == null) {
        throw new UsernameNotFoundException("No user found with username: "   userName);
    }
    boolean enabled = true;
    boolean accountNonExpired = true;
    boolean credentialsNonExpired = true;
    boolean accountNonLocked = true;
    
    logger.debug(String.format("loadUserByUsername password %s", user.getPassword()));
    
    return new org.springframework.security.core.userdetails.User(
      user.getName(), user.getPassword().toLowerCase(), enabled, accountNonExpired,
      credentialsNonExpired, accountNonLocked, getAuthorities(userService.listRolesForUserName(userName)));
}
 

Комментарии:

1. Поскольку вы напрямую используете BCryptPasswordEncoder, убедитесь, что пароли в базе данных не начинаются с «{bcrypt}». Если они это сделают, вы захотите вместо этого использовать DelegatingPasswordEncoder .

2. @SteveRiesenberg, они этого не делают. Вот строка из журнала, который я выгрузил в UserDetailsServiceImpl 15:11:37 INFO [http-nio-8080-exec-19]:service.impl.UserDetailsServiceImpl.loadUserByUsername()39 - loadUserByUsername password $2a$11$UtXCuGuCDO7YAWQDJDLA/eusiU/xpD1g2gBDVv3St/pXuQB427Ajy .

3. Попробуйте удалить .toLowerCase() .

4. @SteveRiesenberg — Блестяще, спасибо! Я не знаю, как это туда попало.