【发布时间】:2021-07-30 16:44:16
【问题描述】:
我正在使用 Spring Security 从 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 是自定义的,但据我了解,Security 应该只调用 match 方法:
public boolean matches(CharSequence password, String token)
{
System.out.println(password);
System.out.println(token);
这就是我看到令牌与存储在数据库中的令牌不同的地方,即使模式相同。
我有一个 UsernamePasswordAuthenticationFilter 但没有其他自定义实现。链中的其他内容是否修改了从数据库中获取的密码?
编辑: 数据库中的密码是:
$22$17$9GD7-A8_W4h9q4_uJ-fFSMhJjKMIbKNJng-G6IfzNCQ
如果我打印出 jdbcAuthentication 返回的 - 应该是相同的 - 密码,那么我会看到:
密码 1:
$22$17$c-gMYpcX5d0YOgf6HBs19MuImTq7wb41tBeKSTw1mMw
只要我不重新启动应用程序,日志中的内容就会保持不变。如果我重新启动,那么它会有所不同,例如:
$22$17$zG0Ph1AM9_xAADIR8l01JVkCNzNwk_s0Z4VJt49NSiU
然后第三次:
$22$17$B4y1Yr8Mt0QuuMg-AK6x02RyAZlQVnbo9A6KKEYitlE
等等。但只要我不重新启动应用程序,jdbcAuthentication 返回的密码就会保持不变——只是不是数据库中的密码。
【问题讨论】: