Feat: [后台]:完成预备修改登陆邮箱、校验密码、校验新邮箱接口

This commit is contained in:
fanxb 2019-11-12 00:19:09 +08:00
parent e8ee4008b2
commit b51616fbe3
12 changed files with 127 additions and 51 deletions

View File

@ -7,10 +7,7 @@ import com.fanxb.bookmark.business.user.service.BaseInfoService;
import com.fanxb.bookmark.common.entity.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
@ -32,8 +29,7 @@ public class BaseInfoController {
/**
* Description: 修改密码
*
* @param oldPass 旧密码
* @param newPass 新密码
* @param body body
* @return com.fanxb.bookmark.common.entity.Result
* @author fanxb
* @date 2019/9/18 15:49
@ -72,4 +68,18 @@ public class BaseInfoController {
baseInfoService.updateEmail(body);
return Result.success(null);
}
/**
* 功能描述: 校验邮箱
*
* @param secret secret
* @return com.fanxb.bookmark.common.entity.Result
* @author fanxb
* @date 2019/11/11 23:27
*/
@GetMapping("/verifyEmail")
public Result verifyEmail(String secret) {
baseInfoService.verifyEmail(secret);
return Result.success(null);
}
}

View File

@ -1,5 +1,6 @@
package com.fanxb.bookmark.business.user.controller;
import com.alibaba.fastjson.JSONObject;
import com.fanxb.bookmark.business.user.entity.LoginBody;
import com.fanxb.bookmark.business.user.entity.RegisterBody;
import com.fanxb.bookmark.business.user.service.UserService;
@ -102,5 +103,18 @@ public class UserController {
return Result.success(null);
}
/**
* 功能描述: 校验密码生成一个actionId
*
* @param password password
* @return com.fanxb.bookmark.common.entity.Result
* @author fanxb
* @date 2019/11/11 23:31
*/
@PostMapping("/checkPassword")
public Result checkPassword(@RequestBody JSONObject obj) {
return Result.success(userService.checkPassword(obj.getString("password")));
}
}

View File

@ -90,11 +90,26 @@ public interface UserDao {
/**
* Description: 根据用户id修改用户名
*
* @author fanxb
* @date 2019/9/20 16:22
* @param userId userId
* @param username username
* @author fanxb
* @date 2019/9/20 16:22
*/
@Update("update user set username=#{username} where userId=#{userId}")
void updateUsernameByUserId(@Param("userId") int userId, @Param("username") String username);
/**
* 更新用户新邮箱
* @param userId userId
* @param newPassword userId
*/
@Update("update user set newEmail=#{newPassword} where userId= #{userId}")
void updateNewEmailByUserId(@Param("userId") int userId, @Param("newPassword") String newPassword);
/**
* 新邮箱校验成功更新邮箱
* @param userId userId
*/
@Update("update user set email=newEmail,newEmail='' where userId=#{userId}")
void updateEmailByUserId(int userId);
}

View File

@ -4,6 +4,7 @@ import com.fanxb.bookmark.business.user.constant.ValidatedConstant;
import lombok.Data;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
/**
@ -15,8 +16,10 @@ import javax.validation.constraints.Pattern;
*/
@Data
public class EmailUpdateBody {
@Pattern(regexp = ValidatedConstant.PASSWORD_REG, message = ValidatedConstant.PASSWORD_MESSAGE)
private String oldPass;
@Email
// @Pattern(regexp = ValidatedConstant.PASSWORD_REG, message = ValidatedConstant.PASSWORD_MESSAGE)
// private String oldPass;
@NotNull(message = "参数不为空")
private String actionId;
@Email(message = "请输入有效邮箱地址")
private String newEmail;
}

View File

@ -1,24 +0,0 @@
package com.fanxb.bookmark.business.user.entity;
import lombok.Data;
/**
* 类功能简述记录用户id和要修改的邮件地址
* 类功能详述
*
* @author fanxb
* @date 2019/9/20 16:47
*/
@Data
public class EmailUpdateRedis {
private int userId;
private String email;
public EmailUpdateRedis() {
}
public EmailUpdateRedis(int userId, String email) {
this.userId = userId;
this.email = email;
}
}

View File

@ -15,8 +15,8 @@ import javax.validation.constraints.Pattern;
@Data
public class UpdatePasswordBody {
@Pattern(regexp = ValidatedConstant.PASSWORD_MESSAGE, message = ValidatedConstant.PASSWORD_MESSAGE)
@Pattern(regexp = ValidatedConstant.PASSWORD_REG, message = ValidatedConstant.PASSWORD_MESSAGE)
private String oldPass;
@Pattern(regexp = ValidatedConstant.PASSWORD_MESSAGE, message = ValidatedConstant.PASSWORD_MESSAGE)
@Pattern(regexp = ValidatedConstant.PASSWORD_REG, message = ValidatedConstant.PASSWORD_MESSAGE)
private String newPass;
}

View File

@ -1,21 +1,20 @@
package com.fanxb.bookmark.business.user.service;
import com.alibaba.fastjson.JSON;
import com.fanxb.bookmark.business.user.constant.RedisConstant;
import com.fanxb.bookmark.business.user.dao.UserDao;
import com.fanxb.bookmark.business.user.entity.EmailUpdateBody;
import com.fanxb.bookmark.business.user.entity.EmailUpdateRedis;
import com.fanxb.bookmark.business.user.entity.UpdatePasswordBody;
import com.fanxb.bookmark.common.constant.Constant;
import com.fanxb.bookmark.common.entity.MailInfo;
import com.fanxb.bookmark.common.exception.CustomException;
import com.fanxb.bookmark.common.exception.FormDataException;
import com.fanxb.bookmark.common.util.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
/**
* 类功能简述
@ -58,28 +57,44 @@ public class BaseInfoService {
}
/**
* 功能描述: 预备更新email需要进行校验
* 功能描述: 预备更新email需要校验密码
*
* @param body body
* @author fanxb
* @date 2019/9/26 17:27
*/
@Transactional(rollbackFor = Exception.class)
public void updateEmail(EmailUpdateBody body) {
int userId = UserContextHolder.get().getUserId();
String realPass = userDao.selectByUserId(userId).getPassword();
if (!realPass.equals(HashUtil.getPassword(body.getOldPass()))) {
throw new FormDataException("旧密码错误");
String checkAuthKey = com.fanxb.bookmark.common.constant.RedisConstant.getPasswordCheckKey(userId, body.getActionId());
String str = RedisUtil.get(checkAuthKey, String.class);
if (str == null) {
throw new CustomException("密码校验失败无法更新email");
}
String key = UUID.randomUUID().toString().replaceAll("-", "");
String url = VERIFY_EMAIL.replaceAll("XXXX", Constant.serviceAddress + VERIFY_EMAIL_PATH + key);
RedisUtil.delete(checkAuthKey);
String secret = UUID.randomUUID().toString().replaceAll("-", "");
String url = VERIFY_EMAIL.replaceAll("XXXX", Constant.serviceAddress + VERIFY_EMAIL_PATH + secret);
log.debug(url);
MailInfo info = new MailInfo(body.getNewEmail(), "验证邮箱", url);
MailUtil.sendMail(info, true);
EmailUpdateRedis redisBody = new EmailUpdateRedis(userId, body.getNewEmail());
RedisUtil.set(RedisConstant.getUpdateEmailKey(key), JSON.toJSONString(redisBody), TimeUtil.DAY_MS);
RedisUtil.set(RedisConstant.getUpdateEmailKey(secret), String.valueOf(userId), TimeUtil.DAY_MS);
userDao.updateNewEmailByUserId(userId, body.getNewEmail());
}
public void verifyEmail(){
/**
* 功能描述: 校验新邮箱校验成功就更新
*
* @param secret secret
* @author fanxb
* @date 2019/11/11 23:24
*/
public void verifyEmail(String secret) {
String key = RedisConstant.getUpdateEmailKey(secret);
Integer userId = RedisUtil.get(key, Integer.class);
RedisUtil.delete(key);
if (userId == null) {
throw new CustomException("校验失败,请重试");
}
userDao.updateEmailByUserId(userId);
}
}

View File

@ -7,6 +7,7 @@ import com.fanxb.bookmark.business.user.entity.LoginRes;
import com.fanxb.bookmark.business.user.entity.RegisterBody;
import com.fanxb.bookmark.common.constant.Constant;
import com.fanxb.bookmark.common.constant.NumberConstant;
import com.fanxb.bookmark.common.constant.RedisConstant;
import com.fanxb.bookmark.common.entity.MailInfo;
import com.fanxb.bookmark.common.entity.User;
import com.fanxb.bookmark.common.exception.FormDataException;
@ -18,6 +19,7 @@ import org.springframework.web.multipart.MultipartFile;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
/**
* 类功能简述
@ -79,6 +81,9 @@ public class UserService {
public void register(RegisterBody body) {
String codeKey = Constant.authCodeKey(body.getEmail());
String realCode = RedisUtil.get(codeKey, String.class);
if (Constant.isDev) {
realCode = "123456";
}
if (StringUtil.isEmpty(realCode) || (!realCode.equals(body.getAuthCode()))) {
throw new FormDataException("验证码错误");
}
@ -182,4 +187,25 @@ public class UserService {
userDao.updateUserIcon(userId, path);
return path;
}
/**
* 功能描述: 密码校验校验成功返回一个actionId以执行敏感操作
*
* @param password password
* @return java.lang.String
* @author fanxb
* @date 2019/11/11 23:41
*/
public String checkPassword(String password) {
int userId = UserContextHolder.get().getUserId();
String pass = HashUtil.getPassword(password);
User user = userDao.selectByUserId(userId);
if (!user.getPassword().equals(pass)) {
throw new FormDataException("密码错误,请重试");
}
String actionId = UUID.randomUUID().toString().replaceAll("-", "");
String key = RedisConstant.getPasswordCheckKey(userId, actionId);
RedisUtil.set(key, "1", 10 * 60 * 1000);
return actionId;
}
}

View File

@ -0,0 +1,13 @@
package com.fanxb.bookmark.common.constant;
/**
* Created with IntelliJ IDEA
* Created By Fxb
* Date: 2019/11/11
* Time: 23:01
*/
public class RedisConstant {
public static String getPasswordCheckKey(int userId, String actionId) {
return "password_check_key_" + userId + "_" + actionId;
}
}

View File

@ -16,6 +16,7 @@ public class User {
private int userId;
private String username;
private String email;
private String newEmail;
private String icon;
@JsonIgnore
private String password;

View File

@ -42,7 +42,7 @@ public class RedisUtil {
*
* @param key key
* @param value value
* @param expireTime 过期时间
* @param expireTime 过期时间,ms
*/
public static void set(String key, String value, long expireTime) {
redisTemplate.opsForValue().set(key, value);
@ -67,6 +67,7 @@ public class RedisUtil {
* @author fanxb
* @date 2019/4/12 10:45
*/
@SuppressWarnings("unchecked")
public static <T> T get(String key, Class<T> tt) {
String str = redisTemplate.opsForValue().get(key);
if (StringUtil.isEmpty(str)) {

View File

@ -0,0 +1,2 @@
ALTER TABLE `bookmark`.`user`
ADD COLUMN `newEmail` varchar(255) NOT NULL DEFAULT '' COMMENT '新邮件地址,尚未确认' AFTER `email`;