Java Spring Security:添加一个;“伪登录”;更改用户信息

Java Spring Security:添加一个;“伪登录”;更改用户信息,java,html,spring,jsp,spring-security,Java,Html,Spring,Jsp,Spring Security,我注意到,几乎每个带有“更改用户信息”表单的Web应用程序都需要密码才能接受某些字段。我正试图将该功能合并到一个简单的项目中,但我缺少了Spring安全方面的一些关键步骤 这是我在没有Spring安全验证的情况下构建它的尝试 前端(JSP): 用户名: 电邮: 当前密码: 新密码: 拯救 后端(Spring MVC): @RequestMapping(value=“/edituserinfo”,method=RequestMethod.POST) 公共字符串editUserInfo(Http

我注意到,几乎每个带有“更改用户信息”表单的Web应用程序都需要密码才能接受某些字段。我正试图将该功能合并到一个简单的项目中,但我缺少了Spring安全方面的一些关键步骤

这是我在没有Spring安全验证的情况下构建它的尝试

前端(JSP):


用户名:
电邮:
当前密码:
新密码:
拯救
后端(Spring MVC):

@RequestMapping(value=“/edituserinfo”,method=RequestMethod.POST)
公共字符串editUserInfo(HttpServletRequest请求、身份验证、模型){
字符串username=authentication.getName();
User=dao.getUserByName(用户名);
List pages=spdao.getAllPages();
model.addAttribute(“页面”,页面);
用户编辑用户=新用户();
editedUser.setUserID(user.getUserID());
editedUser.setAuthories(user.getAuthories());
editedUser.setEnabled(user.isEnabled());
if(request.getParameter(“用户名”).isBlank(){
editedUser.setUsername(user.getUsername());
}否则{
editedUser.setUsername(request.getParameter(“用户名”);
}
if(request.getParameter(“新密码”).isBlank(){
editedUser.setPassword(user.getPassword());
}否则{
字符串clearPw=request.getParameter(“新密码”);
字符串hashPw=encoder.encode(clearPw);
编辑用户设置密码(hashPw);
}
if(request.getParameter(“email”).isBlank(){
editedUser.setEmail(user.getEmail());
}否则{
editedUser.setEmail(request.getParameter(“email”);
}
字符串clearPw=request.getParameter(“当前密码”);
字符串hashPw=encoder.encode(clearPw);
if(hashPw.equals(user.getPassword())){
dao.updateUser(editedUser);
}
返回“重定向:用户控件”;
}

问题是(显然?)新的哈希编码的“当前密码”值与用户的实际当前密码哈希代码不匹配,即使明文值相同。我知道SpringSecurity的登录功能可以解决这个问题,但我只在登录时使用过它。我能做什么来创建一个“伪登录”功能在这个页面上,这样用户就可以不改变他们的信息而不输入他们当前的密码?< /p> 而不是比较他们自己,考虑使用<代码>密码器>匹配< /代码>。从JavaDoc:

/**
*验证从存储器中获取的编码密码是否与提交的原始密码匹配
*密码也被编码后。如果密码匹配,则返回true;如果密码匹配,则返回false
*他们没有。存储的密码本身永远不会被解码。
*@param rawPassword用于编码和匹配的原始密码
*@param encodedPassword要与之比较的存储器中的编码密码
*@如果编码后的原始密码与来自的编码密码匹配,则返回true
*储藏
*/
因此,我们应该:

String clearPw=request.getParameter(“当前密码”);
if(encoder.matches(clearPw,user.getPassword())){
dao.updateUser(editedUser);
}
<form class="form mt-3" id="user-controls-form" method="POST" action="edituserinfo">
    <div class="form-group row align-items-center">
        <div class="col-md-4"><label class="col-form-label" for="username">Username:</label></div>
        <div class="col-md-8"><input type="text" class="form-control" name="username"></div>
    </div>
    <div class="form-group row align-items-center">
        <div class="col-md-4"><label class="col-form-label" for="email">Email:</label></div>
        <div class="col-md-8"><input type="email" class="form-control" name="email"></div>
    </div>
    <div class="form-group row align-items-center">
        <div class="col-md-4"><label class="col-form-label" for="current-password">Current Password:</label></div>
        <div class="col-md-8"><input type="password" class="form-control" name="current-password" required></div>
    </div>
    <div class="form-group row align-items-center">
        <div class="col-md-4"><label class="col-form-label" for="new-password">New Password:</label></div>
        <div class="col-md-8"><input type="password" class="form-control" name="new-password" placeholder="(if changing)"></div>
    </div>
    <div class="form-group row align-items-center">
        <div class="col offset-md-4"><button type="submit" class="btn btn-primary mr-sm-2">Save</button></div>
    </div>
</form>
@RequestMapping(value = "/edituserinfo", method=RequestMethod.POST)
public String editUserInfo(HttpServletRequest request, Authentication authentication, Model model) {
    String username = authentication.getName();
    User user = dao.getUserByName(username);
    List<StaticPage> pages = spdao.getAllPages();
    model.addAttribute("pages", pages);

    User editedUser = new User();
    editedUser.setUserID(user.getUserID());
    editedUser.setAuthorities(user.getAuthorities());
    editedUser.setEnabled(user.isEnabled());

    if (request.getParameter("username").isBlank()) {
        editedUser.setUsername(user.getUsername());
    } else {
        editedUser.setUsername(request.getParameter("username"));
    }

    if (request.getParameter("new-password").isBlank()) {
        editedUser.setPassword(user.getPassword());
    } else {
        String clearPw = request.getParameter("new-password");
        String hashPw = encoder.encode(clearPw);
        editedUser.setPassword(hashPw);
    }

    if (request.getParameter("email").isBlank()) {
        editedUser.setEmail(user.getEmail());
    } else {
        editedUser.setEmail(request.getParameter("email"));
    }

    String clearPw = request.getParameter("current-password");
    String hashPw = encoder.encode(clearPw);
    if (hashPw.equals(user.getPassword())) {
        dao.updateUser(editedUser);
    }

    return "redirect:usercontrols";
}