#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 — Блестяще, спасибо! Я не знаю, как это туда попало.