我在update方法内部实现了一个方法,用于检查UpdateForm中的给定密码是否与db中的编码密码匹配。
我还没有找到任何教程或解决方案,但是我已经尝试了一些方法,但是没有任何效果。
这是我的更新方法
@RequestMapping(value = {"/home/editUser"}, method = RequestMethod.POST)
public String home(@ModelAttribute("editUser") User editUser, Model model) {
logger.info("/home/editUser");
try {
User user = userService.findById(editUser.getId());
if (!user.equals(editUser)) {
//old password matching
if (user.getPassword_1() == editUser.getPassword_1()) {
//encode new password
editUser.setPassword(PassEncoding.getInstance().passwordEncoder.encode(editUser.getPassword()));
//update
userService.update(editUser);
model.addAttribute("msg", "success");
}
else {
System.out.println("not match");
}
} else {
model.addAttribute("msg", "same");
}
} catch (Exception e) {
model.addAttribute("msg", "fail");
logger.error("editUser: " + e.getMessage());
}
model.addAttribute("home", editUser);
return "home";
}
Password_1
是我的 oldpassword(实际),但是我不知道如何实现密码编码器,它提供了
不匹配
在此先感谢您的帮助:)
我刚刚尝试了
if(PassEncoding.getInstance().passwordEncoder.matches(editUser.getPassword_1(), user.getPassword_1()))
但它给出了
不匹配
与
一起使用if(PassEncoding.getInstance().passwordEncoder.matches(editUser.getPassword_1(), user.getPassword()))
非常感谢!
答案 0 :(得分:2)
您可以使用 org.springframework.security.crypto.password.PasswordEncoder
@Autowired
private final PasswordEncoder passwordEncoder;
....
....
boolean result = passwordEncoder.matches(password_plan_text_here, encoded_password_here);
您需要选择以下正确的编码器。
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
答案 1 :(得分:1)
您可以像下面这样实现
如果需要,可以在控制器参数中使用此批注以确保您的用户已通过身份验证。
@AuthenticationPrincipal User user
.........
.........
使用类似结构的方法来检查您的密码是否匹配。如果匹配则返回真值。
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
..........
..........
您输入的密码是您与数据库用户通过
查找所匹配的“密码”User user = userService.findById(editUser.getId());
public boolean userPasswordCheck(String password, User user) {
PasswordEncoder passencoder = new BCryptPasswordEncoder();
String encodedPassword = user.getPassword();
return passencoder.matches(password, encodedPassword);
}
答案 2 :(得分:0)
您必须先对本地密码进行编码,然后再将其与数据库密码进行比较。
最简单的方法是以这种方式对MD5中的密码进行哈希处理,即哈希值永远不会改变,您可以比较密码传递而不会出错。
我希望这是您的要求,如果您需要更多帮助,请告诉我。 (代码或其他)。