这里只用MD5加盐的方式对密码进行加密,为了提高安全性,盐值采用的是用户名+一个从数据库中获取的字段salt
密码比对的逻辑是在QueryDatabaseAuthenticationHandler
的authenticateUsernamePasswordInternal
方法中,因此加密操作如下:
1.自定义一个类MyQueryDatabaseAuthenticationHandler
该类与QueryDatabaseAuthenticationHandler
基本相同
原类的写法是
@Component("queryDatabaseAuthenticationHandler")
public class QueryDatabaseAuthenticationHandler extends AbstractJdbcUsernamePasswordAuthenticationHandler {
@NotNull
private String sql;
@Override
protected final HandlerResult authenticateUsernamePasswordInternal(final UsernamePasswordCredential credential)
throws GeneralSecurityException, PreventedException {
if (StringUtils.isBlank(this.sql) || getJdbcTemplate() == null) {
throw new GeneralSecurityException("Authentication handler is not configured correctly");
}
final String username = credential.getUsername();
final String encryptedPassword = this.getPasswordEncoder().encode(credential.getPassword());
try {
final String dbPassword = getJdbcTemplate().queryForObject(this.sql, String.class, username);
if (!dbPassword.equals(encryptedPassword)) {
throw new FailedLoginException("Password does not match value on record.")<