Spring Boot如何在更新之前检查来自db的编码密码是否与来自表单的密码匹配

时间:2018-11-28 10:12:14

标签: java spring-boot spring-security spring-data-jpa

我在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()))

非常感谢!

3 个答案:

答案 0 :(得分:2)

您可以使用 org.springframework.security.crypto.password.PasswordEncoder

@Autowired
private final PasswordEncoder passwordEncoder;
....
....
boolean result = passwordEncoder.matches(password_plan_text_here, encoded_password_here);

请参阅下面的链接以获取更多信息https://docs.spring.io/spring-security/site/docs/4.2.4.RELEASE/apidocs/org/springframework/security/crypto/password/PasswordEncoder.html

您需要选择以下正确的编码器。

@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中的密码进行哈希处理,即哈希值永远不会改变,您可以比较密码传递而不会出错。

我希望这是您的要求,如果您需要更多帮助,请告诉我。 (代码或其他)。