问题分析
Security配置类中使用了BCryptPasswordEncoder()加密类,而在登录认证的时候提示Warning:Encoded password does not look like BCrypt
// An highlighted block
@Autowired
MyUserDetailsService myUserDetailsService;
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.userDetailsService(myUserDetailsService).passwordEncoder(passwordEncoder());
}
1.数据库密码加密不是BCrypt。
2.从数据库中取出密码封装登录用户的时候没有加密。
解决办法
第一种办法就不用多说了,找到响应的加密类改为相同的加密方式就行。
第二种一般是在UserDetialsSevice 实现类中 LoadUserByUsername method里将返回的User的Password用相同的加密类加密
public class MyUserDetailsService implements UserDetailsService {
@Autowired
private UsersRepository usersRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
users user = usersRepository.findByUsername(username);
if(user==null){
throw new UsernameNotFoundException("User does not exist");
}
return new User(username,new BCryptPasswordEncoder().encode(user.getPassword()), AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
}
}
ps:一般实际项目中数据库存储为加密后的字符串,在Security框架加密验证之前需要先加密成加密字符串和数据库一致,再同时使用Security框架配置的加密类两边同时加密校验。