我注册了jdbcAuthentication()
。如何替换SELECT语句中推送的密码?
PasswordEncoder
是不够的,因为我想连接传入登录请求的用户名和密码,然后对此字符串进行哈希处理,并使用传出哈希作为密码进行JDBC身份验证。
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
.jdbcAuthentication()
.dataSource(datasource)
.usersByUsernameQuery("SELECT username, password, true as enabled "
+ "FROM users WHERE username = ?")
.authoritiesByUsernameQuery("SELECT username, role as authority "
+ "FROM users, roles "
+ "WHERE username = ?");
}
}
我添加了自定义UsernamePasswordAuthenticationFilter
,但在登录尝试期间未调用其attemptAuthentication()
方法。
http.addFilterBefore(new CustomUsernamePasswordAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
答案 0 :(得分:0)
如果我理解正确,数据库中的password
字段实际上是用户名和密码的哈希值?
Spring Security的工作方式是首先仅基于UserDetails
从数据库加载username
对象。然后,它将密码(在任何必要的编码之后 - 例如盐等)与提供的密码(也在任何必要的编码之后)进行比较。
为了实现您的目标,我们相信您需要提供自定义的AuthenticationProvider object that would perform your method of authentication (because it's different than what the built in provider expects. The docs for [AuthenticationProvider are here][1]. You'll also need to modify either your XML or
@Configuration`类才能使用自定义提供程序。