【问题标题】:How loadUserByUsername method in Spring Security works?Spring Security 中的 loadUserByUsername 方法如何工作?
【发布时间】: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


【解决方案1】:

它在哪里验证密码以及为什么它没有获取记录,如果 密码错了?

Spring Security 调用 AuthenticationManager 调用 AuthenticationProvider 调用 AuthenticationService 就像你写的那样。密码验证在AuthenticationProvider 中进行。看看DaoAuthenticationProvider

如果密码错误,BadCredentialsException 将被AuthenticationProvider 抛出。

【讨论】:

    猜你喜欢
    • 2018-12-10
    • 1970-01-01
    • 2011-07-17
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    相关资源
    最近更新 更多