Spring Boot如何在更新前检查数据库中的编码密码是不是与表单中的密码匹配

Posted

技术标签:

【中文标题】Spring Boot如何在更新前检查数据库中的编码密码是不是与表单中的密码匹配【英文标题】:Spring Boot How to check if encoded password from db is matching with password from a form before an updateSpring Boot如何在更新前检查数据库中的编码密码是否与表单中的密码匹配 【发布时间】:2019-04-30 05:07:43 【问题描述】:

我在我的更新方法中实现了一个方法,用于检查 UpdateForm 中的给定密码是否与来自 d​​b 的编码密码匹配。 我还没有找到任何教程或解决方案,但我尝试了一些东西但没有任何效果。 这是我的更新方法

@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 (actual) ,但我不知道如何实现密码编码器,它给出了

不匹配

提前感谢您的帮助:)

我刚试过

if(PassEncoding.getInstance().passwordEncoder.matches(editUser.getPassword_1(), user.getPassword_1()))

但它给了

不匹配

它的工作与

if(PassEncoding.getInstance().passwordEncoder.matches(editUser.getPassword_1(), user.getPassword()))

非常感谢!

【问题讨论】:

【参考方案1】:

你可以使用 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();

【讨论】:

是否需要一个新方法或者我可以在我的更新方法中实现它以便在更新前检查?我不知道如何使用它来解决我的问题^^" 我用你的解决方案编辑,但它给出了同样的错误:/ 当您调用 findById 时,您将收到一个带有编码密码的用户,并且在“editUser”中,editUser.getPassword_1() 将为您提供实际的旧密码。所以你可以用“passwordEncoder.matches(editUser.getPassword_1(), encoded_pa​​ssword_from_db)”替换你的“user.getPassword_1() == editUser.getPassword_1()” 您需要选择与密码相同的编码器。我会更新答案。 好吧,我的错,我做了一些无用的事情 x) 当我用 user.getPassword 更改 user.getPassword_1 时它起作用了,谢谢【参考方案2】:

你可以像下面这样实现

如果你愿意,你可以在控制器参数中使用这个注解来确保你的用户通过了身份验证。

@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);

【讨论】:

【参考方案3】:

您必须先对本地密码进行编码,然后再将其与数据库密码进行比较。

最简单的方法是在 MD5 中对 pass 进行 HASH,这样 HASH 永远不会改变,您可以比较 pass 而不会出错。

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

【讨论】:

我已经使用了 Spring 的 BCryptPasswordEncoder,它就像 MD5 一样不会改变,我将它用于登录方法,但我不知道如何在密码匹配上实现它。如果您有一些带有“PassEncoding.getInstance().passwordEncoder.encode”解决方案的代码,它将很有帮助,谢谢

以上是关于Spring Boot如何在更新前检查数据库中的编码密码是不是与表单中的密码匹配的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Spring Boot 更新 mongoDb 中的单个 JSON 字段

如何自动更新页面上的数据,Angular 7 和 Spring Boot

spring boot 应用在 k8s 中的健康检查

如何检查spring boot应用程序在自动配置类中是不是有某个注释

如何在 Spring Boot 中从资源服务器中的令牌中提取声明

如何检查 Spring Boot 使用了啥数据库池?