【发布时间】:2020-04-21 12:42:11
【问题描述】:
我在我的应用程序中实现了 Spring Security,loadUserByUsername 的实现如下所示
@Override
public UserDetails loadUserByUsername(String emailOrContact) throws UsernameNotFoundException {
log.info("Fetching user infromation from db");
Optional<UserDomain> domain = userRepository.findByEmailOrContactAndIsDeleted(emailOrContact, emailOrContact,
0);
if (!domain.isPresent()) {
log.error("User not found with username {}", emailOrContact);
}
UserDetail userDetail = new UserDetail();
UserDomain userDomain = domain.get();
BeanUtils.copyProperties(userDomain, userDetail);
log.info("User Details {}", userDetail);
return userDetail;
}
我在调试模式下检查此方法的执行,发现当我们提供正确的用户名和密码时,它会从数据库中获取用户,但是当我们提供正确的用户名但密码错误时,它不会从数据库中获取记录。我想知道findByEmailOrContactAndIsDeleted 是否会生成类似的 sql 查询
select * from xyz table where email = 'abc@gmail.com' or contact = '9999999999' and deleted = 0
它在哪里验证密码,如果密码错误,为什么它不获取记录?
【问题讨论】:
-
密码无关紧要,在检索到用户后由 Spring Security 验证。此外,您的代码是错误的,因为它违反了
UserDetailsService的合同。 -
@M.Deinum 你能帮我理解代码中的问题以便我纠正吗?
-
如果找不到用户,则必须抛出
UsernameNotFoundException。
标签: spring-boot spring-security