数据库中的密码与使用spring security获得的密码不同

raogr8fs  于 2021-09-29  发布在  Java
关注(0)|答案(1)|浏览(377)

我使用SpringSecurity从mysql数据库读取用户密码。问题是,从数据库中获取的密码似乎与存储在数据库中的密码不同,因此我得到了身份验证错误。
更奇怪的是,在应用程序重新启动后,我似乎一直得到不同的密码。因为我真的找不到类似的主题,我肯定我忽略了一些基本的东西,但我就是不知道在哪里。以下是我的配置:

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {

    auth.jdbcAuthentication()
            .dataSource(dataSource)
            .passwordEncoder(new PasswordAuthentication())
            .usersByUsernameQuery("SELECT user_name, user_password, verified "
                    + "FROM user_details "
                    + "WHERE user_email = ?")
            .authoritiesByUsernameQuery("SELECT user_name, user_role_desc "
                    + "FROM user_details "
                    + "WHERE user_email = ?");
}

passwordencoder是自定义的,但据我所知,安全性应该只调用matches方法:

public boolean matches(CharSequence password, String token)
{
    System.out.println(password);
    System.out.println(token);

这就是我看到令牌与存储在数据库中的令牌不同的地方,即使模式相同。
我有一个usernamepasswordauthenticationfilter,但没有其他自定义实现。链中是否有其他内容修改从数据库获取的密码?
编辑:数据库中的密码为:
$22$17$9gd7-a8_w4h9q4_uj-FFSMHJKJKMIBKNJNG-g6ifzncq
如果我打印出jdbcauthentication返回的密码(应该是相同的),那么我会看到:
密码1: $22$17$c-gMYpcX5d0YOgf6HBs19MuImTq7wb41tBeKSTw1mMw 只要我不重新启动应用程序,日志中的内容将保持不变。如果我重新启动,则情况会有所不同,例如: $22$17$zG0Ph1AM9_xAADIR8l01JVkCNzNwk_s0Z4VJt49NSiU 第三次: $22$17$B4y1Yr8Mt0QuuMg-AK6x02RyAZlQVnbo9A6KKEYitlE 等等,但只要我不重新启动应用程序,jdbcauthentication返回的密码就保持不变——只是数据库中的密码不同。

krugob8w

krugob8w1#

我想我明白了。错误在于,我认为UsersBySernameQuery和authoritiesbyusernamequery在默认情况下都是使用从请求中提取的值来准备的。
事实并非如此。authoritiesbyusernamequery使用usersbyusernamequery返回的第一列的结果进行准备。这破坏了流程,因为我在验证中使用了电子邮件地址,但在第一次查询中,我仍然选择了要返回的用户名,因此权限查询失败。

相关问题