在使用spring密码进行身份验证之前,如何在表单登录中修改密码?

时间:2015-02-05 16:25:44

标签: spring spring-security spring-boot

我注册了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);

1 个答案:

答案 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`类才能使用自定义提供程序。