2017-03-09 116 views
0

我有一个包含用户信息一个实体类:更新用户信息(春季启动)

@Entity 
@Table(name = "user") 
@PasswordMatch(message="{register.repeatPassword.mismatch}") 
@DynamicUpdate 
public class SiteUser { 
@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name = "id") 
private Long id; 

@Column(name = "email", unique=true) 
@Email(message="{register.email.invalid}") 
@NotBlank(message="{register.email.invalid}") 
private String email; 

@Transient 
@Size(min=5, max=15, message="{register.password.size}") 
private String plainPassword; 

@Transient 
private String repeatPassword; 

@Column(name = "password", length=60) 
private String password; 

@Column(name="enabled") 
private boolean enabled = false; 

@Column(name="role", length=20) 
private String role; 

@NotNull 
@Column(name="firstname", length=20) 
@Size(min=2, max=20, message="{register.firstname.size}") 
private String firstname; 

@NotNull 
@Column(name="surname", length=25) 
@Size(min=2, max=25, message="{register.surname.size}") 
private String surname; 

public SiteUser() { 

} 

public SiteUser(String email, String password, String firstname, String surname) { 
    this.email = email; 
    this.setPlainPassword(password); 
    this.repeatPassword = password; 
    this.enabled= true; 
    this.firstname= firstname; 
    this.surname= surname; 
} 

public Long getId() { 
    return id; 
} 


public void setId(Long id) { 
    this.id = id; 
} 

public String getEmail() { 
    return email; 
} 

public void setEmail(String email) { 
    this.email = email; 
} 

public String getPassword() { 
    return password; 
} 

public void setPassword(String password) { 
    this.password = password; 
} 

public String getRole() { 
    return role; 
} 

public void setRole(String role) { 
    this.role = role; 
} 

public String getPlainPassword() { 
    return plainPassword; 
} 

public void setPlainPassword(String plainPassword) { 
    this.password = new BCryptPasswordEncoder().encode(plainPassword); 
    this.plainPassword = plainPassword; 
} 

public String getRepeatPassword() { 
    return repeatPassword; 
} 

public void setRepeatPassword(String repeatPassword) { 
    this.repeatPassword = repeatPassword; 
} 

public boolean isEnabled() { 
    return enabled; 
} 

public void setEnabled(boolean enabled) { 
    this.enabled = enabled; 
} 

public String getFirstname() { 
    return firstname; 
} 

public void setFirstname(String firstname) { 
    this.firstname = firstname; 
} 

public String getSurname() { 
    return surname; 
} 

public void setSurname(String surname) { 
    this.surname = surname; 
} 
} 

我的问题是,注册用户我加的独特和@NotBlank注解给我的电子邮件和名字/姓氏列所以现在我想只更新我的密码我有2个问题

1 - 我必须添加其他字段隐藏在更新形式,因为当我尝试更新我的数据,他们不能为空

2-使用道的save()方法我得到一个错误,说明有相同的电子邮件数据库。

这个问题有什么样的逻辑解决方案吗?

====================更新=========================

控制器:

@RequestMapping(value ="/resetPassword", method = RequestMethod.GET) 
ModelAndView resetPasswordMailRecieved(ModelAndView modelAndView,   @RequestParam("t") String tokenString) { 

    VerificationToken token = userService.getVerificationToken(tokenString); 
    SiteUser user = token.getUser(); 

    if(token == null) 
    { 
     modelAndView.setViewName("redirect:/invalidUser"); 
     return modelAndView; 
    } 

    Date expirydate = token.getExpiry(); 

    if(expirydate.before(new Date())) 
    { 
     modelAndView.setViewName("redirect:/expiredToken"); 
     userService.deleteToken(token); 
     return modelAndView; 
    } 

    userService.deleteToken(token); 
    modelAndView.getModel().put("user", user); 
    modelAndView.setViewName("app.resetPass"); 
    return modelAndView; 
} 

JSP文件:

<form:form method="post" modelAttribute="user" class="login-form"> 

       <form:input type="hidden" path="firstname" /> 
       <form:input type="hidden" path="surname" /> 
       <form:input type="hidden" path="email" /> 

       <div class="input-group"> 
        <form:input type="password" path="plainPassword" 
         placeholder="Password" class="form-control" /> 
       </div> 

       <div class="input-group"> 
        <form:input path="repeatPassword" type="password" 
         placeholder="Repeat password" class="form-control" /> 
       </div> 

       <div class="input-group"> 
        <button type="submit" class="btn-primary pull-right">Change 
         Password</button> 
       </div> 
      </form:form> 

userDAO的:

@Repository 
public interface UserDao extends CrudRepository<SiteUser, Long> { 
    SiteUser findByEmail(String email); 
} 

UserService:

@Service 
public class UserService implements UserDetailsService { 
@Autowired 
private UserDao userDao; 

@Autowired 
PasswordEncoder encoder; 

@Autowired 
private VerificationDao verificationDao; 

public void register(SiteUser user) { 
    user.setRole("ROLE_USER"); 
    userDao.save(user); 
} 

@Override 
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException { 
    SiteUser user = userDao.findByEmail(email); 

    if (user == null) { 
     return null; 
    } 

    List<GrantedAuthority> auth = AuthorityUtils.commaSeparatedStringToAuthorityList(user.getRole()); 

    String password = user.getPassword(); 
    boolean enabled = user.isEnabled(); 


    return new User(email, password, enabled, true, true, true, auth); 
} 

public void save(SiteUser user) 
{ 
    userDao.save(user); 
} 

public void updatePass(SiteUser user,String pass){ 
    user.setPlainPassword(pass); 
} 

public String createEmailVerificationToken(SiteUser user) 
{ 

    VerificationToken token = new VerificationToken(UUID.randomUUID().toString(), user, TokenType.REGISTRATION); 
    verificationDao.save(token); 
    return token.getToken(); 
} 

public String createPasswordResetVerificationToken(SiteUser user) 
{ 
    VerificationToken token = new VerificationToken(UUID.randomUUID().toString(), user, TokenType.PASSWORD_RESET); 
    verificationDao.save(token); 
    return token.getToken(); 
} 

public VerificationToken getVerificationToken(String token) 
{ 
    return verificationDao.findByToken(token); 
} 

public void deleteToken(VerificationToken token) { 
    verificationDao.delete(token); 
} 

public SiteUser get(String email) { 

    return userDao.findByEmail(email); 
} 

public SiteUser get(Long id) { 

    return userDao.findOne(id); 
} 

}

+0

确实张贴了DAO和服务代码以及 –

+0

@邦德JavaBond嘿老兄,我也加了服务和道码。 –

回答

1

添加在你的JSP文件中的以下,只是其他隐藏字段后:

<form:input type="hidden" path="id"/> 
0
@RequestMapping(value="/updateUserInfo", method=RequestMethod.POST) 
public ResponseEntity profileInfo(
      @RequestBody HashMap<String, Object> mapper 
     ) throws Exception{ 

    int id = (Integer) mapper.get("id"); 
    String email = (String) mapper.get("email"); 
    String username = (String) mapper.get("username"); 
    String firstName = (String) mapper.get("firstName"); 
    String lastName = (String) mapper.get("lastName"); 
    String newPassword = (String) mapper.get("newPassword"); 
    String currentPassword = (String) mapper.get("currentPassword"); 

    User currentUser = userService.findById(Long.valueOf(id)); 

    if(currentUser == null) { 
     throw new Exception ("User not found"); 
    } 

    if(userService.findByEmail(email) != null) { 
     if(userService.findByEmail(email).getId() != currentUser.getId()) { 
      return new ResponseEntity("Email not found!", HttpStatus.BAD_REQUEST); 
     } 
    } 

    if(userService.findByUsername(username) != null) { 
     if(userService.findByUsername(username).getId() != currentUser.getId()) { 
      return new ResponseEntity("Username not found!", HttpStatus.BAD_REQUEST); 
     } 
    } 

    SecurityConfig securityConfig = new SecurityConfig(); 


     BCryptPasswordEncoder passwordEncoder = SecurityUtility.passwordEncoder(); 
     String dbPassword = currentUser.getPassword(); 

     if(null != currentPassword) 
     if(passwordEncoder.matches(currentPassword, dbPassword)) { 
      if(newPassword != null && !newPassword.isEmpty() && !newPassword.equals("")) { 
       currentUser.setPassword(passwordEncoder.encode(newPassword)); 
      } 
      currentUser.setEmail(email); 
     } else { 
      return new ResponseEntity("Incorrect current password!", HttpStatus.BAD_REQUEST); 
     } 


    currentUser.setFirstName(firstName); 
    currentUser.setLastName(lastName); 
    currentUser.setUsername(username); 


    userService.save(currentUser); 

    return new ResponseEntity("Update Success", HttpStatus.OK); 
} 
+0

你的答案简短的解释会很好。 –