我使用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返回的密码就保持不变——只是数据库中的密码不同。
1条答案
按热度按时间krugob8w1#
我想我明白了。错误在于,我认为UsersBySernameQuery和authoritiesbyusernamequery在默认情况下都是使用从请求中提取的值来准备的。
事实并非如此。authoritiesbyusernamequery使用usersbyusernamequery返回的第一列的结果进行准备。这破坏了流程,因为我在验证中使用了电子邮件地址,但在第一次查询中,我仍然选择了要返回的用户名,因此权限查询失败。