java - 使用 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;
}
}
解决方案
您不能像这样在查询级别尝试比较它们。即使您尝试检查原始值的编码版本,它也不起作用;您必须获取存储的编码密码的值,然后使用 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());
推荐阅读
- angular - 重用 Angular 8 响应式表单来创建/更新产品
- node.js - 网站或应用程序上的数据泄露暴露了您的密码。Chrome 建议更改密码
- laravel - 雄辩地在使用碳之间返回不同的年份结果
- javascript - 如何使用 Mocha/Chai/Protractor 单击复选框
- c# - C# 监听键并输出结果
- machine-learning - 计算簇中的原子数
- reactjs - 用 .replace 将字符串替换为 react 组件
- android - 无法从 android 将视频文件上传到 aws s3 存储桶
- javascript - 如何获得位于两侧的字符/单词,我们选择的字符落在它们之间?
- c++ - 重构使用动态转换的 std::set 的比较运算符