为什么DaoAuthenticationProvider中的retrieveuser方法在UsernameNotFoundException中调用passwordencoder?

时间:2016-06-26 16:04:18

标签: spring spring-security

我查看了DaoAuthenticationProvider的来源,我在retrieveUser方法中发现了一些看起来很奇怪的东西。

如果userDetailService引发了UserNameNotFoundException,则以下代码位于catch

catch (UsernameNotFoundException notFound) {
        if (authentication.getCredentials() != null) {
            String presentedPassword = authentication.getCredentials().toString();
            passwordEncoder.isPasswordValid(userNotFoundEncodedPassword,
                    presentedPassword, null);
        }
        throw notFound;
    }

我不明白为什么它会调用passwordEncoder.isPasswordValid。它不会将它用于任何东西,然后再次在链中抛出异常。据我所知,passwordencoder不会抛出任何异常,它会返回boolean(这似乎不会用于任何事情)。

有人有任何想法吗?

1 个答案:

答案 0 :(得分:0)

请参阅SEC-2056

  

Spring Security的DaoAuthenticationProvider使用PasswordEncoder接口对提交的密码与实际密码进行比较,对用户进行身份验证。如果未找到用户,则跳过比较,这取决于PasswordEncoder实现,可能导致尝试验证实际用户与不存在的用户所需的时间量的显着差异。这开启了侧通道攻击的可能性,使恶意用户能够确定用户名是否有效。

     

[...]

     

<强>修正:

     

当找不到用户时,DaoAuthenticationProvider现在执行PasswordEncoder.isPasswordValid。

另请参阅:SEC-2608