From 6486c5330270eeaf7e752154518fa9db3541272d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=8D=8E?= <672943942@qq.com> Date: Tue, 9 Jul 2019 09:53:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BF=AE=E6=94=B9=E5=AF=86?= =?UTF-8?q?=E7=A0=81=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../config/security/WebSecurityConfig.java | 3 + .../dao/VerificationTokenMapper.java | 2 +- .../java/com/fstack/service/UserService.java | 6 ++ .../fstack/service/impl/UserServiceImpl.java | 24 +++++- .../fstack/validator/NewUserPwdValidator.java | 75 ++++++++++++++++++ .../fstack/web/controller/UserController.java | 27 +++++++ .../java/com/fstack/web/dto/UserPwdDto.java | 17 ++++ src/main/resources/application.properties | 2 +- src/main/resources/messages.properties | 1 + .../resources/templates/forum/user-login.html | 2 +- .../forum/user-updatepwd-result.html | 48 +++++++++++ .../templates/forum/user-updatepwd.html | 79 +++++++++++++++++++ .../resources/templates/fragments/header.html | 1 + 14 files changed, 284 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/fstack/validator/NewUserPwdValidator.java create mode 100644 src/main/java/com/fstack/web/dto/UserPwdDto.java create mode 100644 src/main/resources/templates/forum/user-updatepwd-result.html create mode 100644 src/main/resources/templates/forum/user-updatepwd.html diff --git a/pom.xml b/pom.xml index f69ce05..c4bb20e 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.fstack FStackForum - 1.1.1 + 1.2.0 jar FStackForum diff --git a/src/main/java/com/fstack/config/security/WebSecurityConfig.java b/src/main/java/com/fstack/config/security/WebSecurityConfig.java index 2c4bdd0..94dd22d 100644 --- a/src/main/java/com/fstack/config/security/WebSecurityConfig.java +++ b/src/main/java/com/fstack/config/security/WebSecurityConfig.java @@ -75,6 +75,9 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { .antMatchers("/user/registration-confirm") .permitAll() + .antMatchers("/user/updatepwd") + .permitAll() + .anyRequest() .authenticated() .and() diff --git a/src/main/java/com/fstack/persistence/dao/VerificationTokenMapper.java b/src/main/java/com/fstack/persistence/dao/VerificationTokenMapper.java index b37ec34..50c4170 100644 --- a/src/main/java/com/fstack/persistence/dao/VerificationTokenMapper.java +++ b/src/main/java/com/fstack/persistence/dao/VerificationTokenMapper.java @@ -11,6 +11,6 @@ public interface VerificationTokenMapper { VerificationToken findByToken(String token); - VerificationToken findByUserId(Long userId); + VerificationToken findByUserId(String userId); } \ No newline at end of file diff --git a/src/main/java/com/fstack/service/UserService.java b/src/main/java/com/fstack/service/UserService.java index 7f85bc8..d2c1711 100644 --- a/src/main/java/com/fstack/service/UserService.java +++ b/src/main/java/com/fstack/service/UserService.java @@ -5,6 +5,8 @@ import java.util.Map; import javax.servlet.http.HttpServletRequest; import com.fstack.persistence.model.User; +import com.fstack.persistence.model.VerificationToken; +import com.fstack.web.dto.UserPwdDto; import com.fstack.web.dto.UserRegistrationDto; import com.fstack.web.dto.UserSettingsDto; @@ -30,4 +32,8 @@ public interface UserService { Map confirmUserRegistrationWithToken(String token); + VerificationToken findByToken(String token); + + Map updateUserPwd(UserPwdDto userPwdDto); + } diff --git a/src/main/java/com/fstack/service/impl/UserServiceImpl.java b/src/main/java/com/fstack/service/impl/UserServiceImpl.java index 2752c14..3b096f6 100644 --- a/src/main/java/com/fstack/service/impl/UserServiceImpl.java +++ b/src/main/java/com/fstack/service/impl/UserServiceImpl.java @@ -1,6 +1,5 @@ package com.fstack.service.impl; -import com.fstack.constant.StorageConstant; import com.fstack.event.OnRegistrationCompleteEvent; import com.fstack.persistence.dao.CommentMapper; import com.fstack.persistence.dao.PostMapper; @@ -12,6 +11,7 @@ import com.fstack.persistence.model.User; import com.fstack.persistence.model.VerificationToken; import com.fstack.service.StorageService; import com.fstack.service.UserService; +import com.fstack.web.dto.UserPwdDto; import com.fstack.web.dto.UserRegistrationDto; import com.fstack.web.dto.UserSettingsDto; import org.slf4j.Logger; @@ -199,4 +199,26 @@ public class UserServiceImpl implements UserService { return attributes; } + @Override + public VerificationToken findByToken(String token) { + return this.verificationTokenMapper.findByToken(token); + } + + @Override + public Map updateUserPwd(UserPwdDto userPwdDto) { + Map attributes = new HashMap<>(); + User user = this.userMapper.findByEmail(userPwdDto.getEmail()); + if (null == user) return null; + VerificationToken byUserId = this.verificationTokenMapper.findByUserId(user.getId().toString()); + if (null != byUserId && byUserId.getToken().equalsIgnoreCase(userPwdDto.getToken())) { + user.setPassword(this.passwordEncoder.encode(userPwdDto.getPassword())); + int update = this.userMapper.update(user); + if (update > 0) attributes.put("updateUserPwdResult", "success"); + else attributes.put("updateUserPwdResult", "failure"); + } else { + attributes.put("updateUserPwdResult", "failure"); + } + return attributes; + } + } diff --git a/src/main/java/com/fstack/validator/NewUserPwdValidator.java b/src/main/java/com/fstack/validator/NewUserPwdValidator.java new file mode 100644 index 0000000..f2f8878 --- /dev/null +++ b/src/main/java/com/fstack/validator/NewUserPwdValidator.java @@ -0,0 +1,75 @@ +package com.fstack.validator; + +import com.fstack.constant.UserConstant; +import com.fstack.persistence.model.User; +import com.fstack.persistence.model.VerificationToken; +import com.fstack.service.UserService; +import com.fstack.web.dto.UserPwdDto; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.validation.Errors; +import org.springframework.validation.ValidationUtils; +import org.springframework.validation.Validator; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +@Component +public class NewUserPwdValidator implements Validator { + + private static final String EMAIL_PATTERN = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$"; + + @Autowired + private UserService userService; + + @Override + public boolean supports(Class aClass) { + return User.class.equals(aClass); + } + + @Override + public void validate(Object object, Errors errors) { + UserPwdDto userForm = (UserPwdDto) object; + + // email validation + ValidationUtils.rejectIfEmptyOrWhitespace(errors, "token", "NotEmpty"); + if (userForm.getToken() != null && !userForm.getToken().isEmpty()) { + VerificationToken byToken = userService.findByToken(userForm.getToken()); + if (null == byToken) { + errors.rejectValue("token", "userForm.token.invalid"); + } + } + + // email validation + ValidationUtils.rejectIfEmptyOrWhitespace(errors, "email", "NotEmpty"); + if (userForm.getEmail() != null && !userForm.getEmail().isEmpty()) { + Pattern pattern = Pattern.compile(EMAIL_PATTERN); + Matcher matcher = pattern.matcher(userForm.getEmail()); + if (!matcher.matches()) { + errors.rejectValue("email", "userForm.email.invalid"); + } + if (null == userService.findByEmail(userForm.getEmail())) { + errors.rejectValue("email", "userForm.email.invalid"); + } + } + + // password validation + ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password", "NotEmpty"); + if (userForm.getPassword() != null && !userForm.getPassword().isEmpty()) { + if (userForm.getPassword().length() < UserConstant.PASSOWRD_LENGTH_MIN || userForm.getPassword().length() > UserConstant.PASSOWRD_LENGTH_MAX) { + errors.rejectValue("password", "userForm.password.length"); + } + } + + // password confirmation validation + ValidationUtils.rejectIfEmptyOrWhitespace(errors, "matchingPassword", "NotEmpty"); + if (userForm.getMatchingPassword() != null && !userForm.getMatchingPassword().isEmpty()) { + if (userForm.getMatchingPassword().length() < UserConstant.PASSOWRD_LENGTH_MIN || userForm.getMatchingPassword().length() > UserConstant.PASSOWRD_LENGTH_MAX) { + errors.rejectValue("matchingPassword", "userForm.password.length"); + } + if (!userForm.getMatchingPassword().equals(userForm.getPassword())) { + errors.rejectValue("matchingPassword", "userForm.password.diff"); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/fstack/web/controller/UserController.java b/src/main/java/com/fstack/web/controller/UserController.java index fafd63d..998a8c5 100644 --- a/src/main/java/com/fstack/web/controller/UserController.java +++ b/src/main/java/com/fstack/web/controller/UserController.java @@ -5,6 +5,8 @@ import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; +import com.fstack.validator.NewUserPwdValidator; +import com.fstack.web.dto.UserPwdDto; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.slf4j.Logger; @@ -39,6 +41,10 @@ public class UserController { @Autowired private NewUserFormValidator userValidator; + @Autowired + private NewUserPwdValidator newUserPwdValidator; + + @ApiOperation("获取用户信息") @RequestMapping(value = "/{userId}", method = RequestMethod.GET) public String showUserProfilePage(@RequestParam(value = "tab", required = false) String tabType, @@ -126,4 +132,25 @@ public class UserController { return "forum/user-settings"; } + @RequestMapping(value = "/updatepwd", method = RequestMethod.GET) + public String updatePwd(Model model) { + model.addAttribute("userDto", new UserPwdDto()); + return "forum/user-updatepwd"; + } + + @RequestMapping(value = "/updatepwd", method = RequestMethod.POST) + public String updatepwd(@Valid @ModelAttribute("userDto") UserPwdDto userDto, + BindingResult bindingResult, Model model) { + this.newUserPwdValidator.validate(userDto, bindingResult); + if (bindingResult.hasErrors()) { + logger.info("BindingResult has errors >> " + bindingResult.getFieldError()); + return "forum/user-updatepwd"; + } + Map attributes = this.userService.updateUserPwd(userDto); + if (null == attributes) { + throw new ResourceNotFoundException("attributes not found."); + } + model.addAllAttributes(attributes); + return "forum/user-updatepwd-result"; + } } diff --git a/src/main/java/com/fstack/web/dto/UserPwdDto.java b/src/main/java/com/fstack/web/dto/UserPwdDto.java new file mode 100644 index 0000000..dafb543 --- /dev/null +++ b/src/main/java/com/fstack/web/dto/UserPwdDto.java @@ -0,0 +1,17 @@ +package com.fstack.web.dto; + +import lombok.Data; + +@Data +public class UserPwdDto { + + private String token; + + private String email; + + private String password; + + private String matchingPassword; + + +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index fb8e610..5c92b3f 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,5 +1,5 @@ server.port=9999 -spring.profiles.active= dev +spring.profiles.active= pro server.servlet.context-path= / spring.aop.proxy-target-class=true # ============================== diff --git a/src/main/resources/messages.properties b/src/main/resources/messages.properties index 7ac937a..3261352 100644 --- a/src/main/resources/messages.properties +++ b/src/main/resources/messages.properties @@ -3,6 +3,7 @@ NotEmpty=This field can't be empty. userForm.username.duplicate=Someone already has that username. userForm.username.length=Please use between 3 and 10 characters. userForm.email.invalid=This is an invalid Email. +userForm.token.invalid=This is an invalid Token. userForm.email.duplicate=This Email already exists. userForm.password.length=Try one with at least 5 characters. userForm.password.diff=These passwords don't match. diff --git a/src/main/resources/templates/forum/user-login.html b/src/main/resources/templates/forum/user-login.html index 44af823..1326b5d 100644 --- a/src/main/resources/templates/forum/user-login.html +++ b/src/main/resources/templates/forum/user-login.html @@ -25,7 +25,7 @@
- +
diff --git a/src/main/resources/templates/forum/user-updatepwd-result.html b/src/main/resources/templates/forum/user-updatepwd-result.html new file mode 100644 index 0000000..f882364 --- /dev/null +++ b/src/main/resources/templates/forum/user-updatepwd-result.html @@ -0,0 +1,48 @@ + + + + + +
+
+
+
+
+
+
+
+
+
+
+ + 修改成功。 +
+
+
+
+ + 修改失败。 +
+
+
+
+
+
+
+
+
+
广告位1
+
详情请联系管理员:)
+
+ +
+
广告位2
+
详情请联系管理员:)
+
+
+
+
+
+
+ + \ No newline at end of file diff --git a/src/main/resources/templates/forum/user-updatepwd.html b/src/main/resources/templates/forum/user-updatepwd.html new file mode 100644 index 0000000..8751ca7 --- /dev/null +++ b/src/main/resources/templates/forum/user-updatepwd.html @@ -0,0 +1,79 @@ + + + + + +
+
+
+
+
+
+
+
+

忘记密码

+
+ +
+
+ +
+
+ Email Error +
+
+ +
+
+ +
+
+ Token Error +
+
+ +
+
+ +
+
+ Password Error +
+
+ +
+
+ +
+
+ Password Confirmation Error +
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+
广告位1
+
详情请联系管理员:)
+
+ +
+
广告位2
+
详情请联系管理员:)
+
+
+
+
+
+
+ + \ No newline at end of file diff --git a/src/main/resources/templates/fragments/header.html b/src/main/resources/templates/fragments/header.html index 80c951a..ac10590 100644 --- a/src/main/resources/templates/fragments/header.html +++ b/src/main/resources/templates/fragments/header.html @@ -22,6 +22,7 @@
  • 首页
  • 注册
  • 登录
  • +
  • 忘记密码