首页 > 解决方案 > 使用 BCryptPasswordEncoder 问题验证用户

问题描述

我一直在尝试在 Spring MVC 的登录注册功能中对用户的密码进行编码。

我知道我应该使用passwordEncoder.matches(rawPassword, encodedPassword)但是我不确定如何从数据库中检索编码的密码。

以下是我的代码:

public User validateUser(Login login) {

String rawPassword = login.getPassword();

String sql = "select * from users where username='" + login.getUsername() + "' and 
password='" + passwordEncoder.matches(rawPassword)
+ "'";
List<User> users = jdbcTemplate.query(sql, new UserMapper());
return users.size() > 0 ? users.get(0) : null;
}
}

class UserMapper implements RowMapper<User> {
public User mapRow(ResultSet rs, int arg1) throws SQLException {
User user = new User();
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
user.setFirstname(rs.getString("firstname"));
user.setLastname(rs.getString("lastname"));
user.setEmail(rs.getString("email"));
user.setAddress(rs.getString("address"));
return user;
}
}

标签: javaspring

解决方案


您不能像这样在查询级别尝试比较它们。即使您尝试检查原始值的编码版本,它也不起作用;您必须获取存储的编码密码的值,然后使用 bcrypt 查看它是否匹配。

// Remove the password check in the query
String sql = "select * from users where username='" + login.getUsername() + "'";
// You'll have a list of users for that username.
List<User> users = jdbcTemplate.query(sql, new UserMapper());

在这一点上,我会说,你有一点问题。如果您的用户名不是代码中建议的唯一用户名,您将不得不将用户过滤到具有匹配密码的用户;你能保证只有一个吗?

无论如何,此时您正在使用基本的 Java 代码。无论您在循环或过滤器中应用什么逻辑来让单个用户登录,您都需要像这样比较密码:

boolean matched = passwordEncoder.match(rawPassword, user.getPassword());

推荐阅读