我正在构建基于Spring MVC和Spring Security的Web应用程序。
我已经实现了重置密码功能。系统管理员将重置任何用户的密码。随机生成的密码将通过电子邮件发送给用户,并在数据库中更新。
现在,当用户使用随机生成的密码登录时,我希望强制用户更改其密码。
请查看我的用户表。
用户ID bigint(20)
用户名 varchar(20)
密码 varchar(65)
电子邮件 varchar(50)
名字 varchar(20)
姓氏 varchar(20)
组名 varchar(50)
启用 tinyint(1)
凭据未过期 tinyint(1)
我的身份验证提供者
<!--
Configuring Authentication Provider to make use of spring security
provided Jdbc user management service
-->
<authentication-provider user-service-ref="jdbcUserService">
<!--
Configuring SHA-1 Password Encoding scheme to secure user credential
-->
<password-encoder ref="sha1PasswordEncoder" />
</authentication-provider>
</authentication-manager>
我使用了继承自 JDBCDaoImpl 的 JDBCUserDetailsService 作为 jdbcUserService。
当我重置密码时,我想将用户表中的 credentialNonExpired 设置为 false。
我已经成功地实现了这一点。
但是当我登录时,Spring Security 的 JDBCUserDetailsService loadUserByUsername 只能获取到用户名、密码和启用状态列,其余所有字段都被设置为 true。
protected List<UserDetails> loadUsersByUsername(String username) {
return getJdbcTemplate().query(usersByUsernameQuery, new String[] {username}, new RowMapper<UserDetails>() {
public UserDetails mapRow(ResultSet rs, int rowNum) throws SQLException {
String username = rs.getString(1);
String password = rs.getString(2);
boolean enabled = rs.getBoolean(3);
return new User(username, password, enabled, true, true, true, AuthorityUtils.NO_AUTHORITIES);
}
});
}
但我想要实际的credentialNonExpired字段,这个字段在重置密码时被设置,这样Spring Security会抛出CREDENTIALEXPIREDEXCEPTION。
我通过加载上述方法来实现这一点,但是否有其他方法在用户使用过期密码登录时将其重定向到更改密码页面。
请告诉我如何做到这一点?
UsernamePasswordResetAuthentication
使用用户名、密码和新密码