UpdateUserController.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486
  1. package com.uas.sso.controller;
  2. import com.alibaba.fastjson.JSON;
  3. import com.uas.sso.core.Status;
  4. import com.uas.sso.entity.*;
  5. import com.uas.sso.service.UserService;
  6. import com.uas.sso.support.SystemSession;
  7. import org.springframework.util.Assert;
  8. import org.springframework.util.CollectionUtils;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.ui.ModelMap;
  11. import org.springframework.util.StringUtils;
  12. import org.springframework.web.bind.annotation.*;
  13. import org.springframework.web.servlet.ModelAndView;
  14. import java.util.HashMap;
  15. import java.util.List;
  16. import java.util.Map;
  17. /**
  18. * @author wangmh
  19. * @create 2018-01-11 17:11
  20. * @desc 修改用户信息(需要登录)
  21. **/
  22. @RestController
  23. @RequestMapping("/update/user")
  24. public class UpdateUserController extends BaseController {
  25. @Autowired
  26. private UserService userService;
  27. /**
  28. * 校验信息token有效期
  29. */
  30. private static final int EXPIRES = 7 * 24 * 60 * 60;
  31. /**
  32. * 获取可以校验方式
  33. *
  34. * @return
  35. */
  36. @RequestMapping(value = "/checkType", method = RequestMethod.GET)
  37. public ModelMap getCheckType() {
  38. // 获取用户信息
  39. UserAccount userAccount = SystemSession.getUserAccount();
  40. User user = userService.findOne(userAccount.getUserUU());
  41. // 设置返回数据
  42. ModelMap data = new ModelMap();
  43. data.put("mobile", Status.AUTHENTICATED.getCode() == user.getMobileValidCode() ? user.getMobile() : null);
  44. data.put("email", Status.AUTHENTICATED.getCode() == user.getEmailValidCode() ? user.getEmail() : null);
  45. data.put("questions", !CollectionUtils.isEmpty(user.getQuestions()) ? user.getQuestions() : null);
  46. request.getSession().setAttribute("user", user);
  47. return success(data);
  48. }
  49. /**
  50. * 获取校验手机号验证码
  51. *
  52. * @author wangmh
  53. * @date 2018/1/11 20:16
  54. * @param mobile 手机号
  55. * @return
  56. */
  57. @RequestMapping(value = "/check/mobile", method = RequestMethod.GET)
  58. public ModelMap checkByMobile(String mobile) {
  59. // 获取验证码
  60. String token = getMobileToken(mobile);
  61. // 设置返回数据
  62. ModelMap data = new ModelMap();
  63. data.put("token", token);
  64. data.put("code", request.getSession().getAttribute("code"));
  65. request.getSession().setAttribute("token", token);
  66. return success(data);
  67. }
  68. /**
  69. * 校验手机号
  70. *
  71. * @author wangmh
  72. * @date 2018/1/11 20:17
  73. * @param mobile 手机号
  74. * @param code 验证码
  75. * @param token 验证码token
  76. * @return
  77. */
  78. @RequestMapping(value = "/check/mobile", method = RequestMethod.POST)
  79. public ModelMap checkByMobile(String mobile, String code, @RequestParam String token) {
  80. // 校验空参数
  81. if (StringUtils.isEmpty(mobile)) {
  82. return error("手机号不能为空");
  83. }
  84. if (StringUtils.isEmpty(code)) {
  85. return error("验证码不能为空");
  86. }
  87. // 校验token
  88. Token existToken = tokenService.findOne(token);
  89. if (existToken == null) {
  90. return error("请重新获取验证码");
  91. }
  92. // 校验验证码
  93. checkMobileCode(token, mobile, code);
  94. tokenService.delete(token);
  95. // 设置返回数据
  96. User user = userService.findByMobile(mobile);
  97. existToken = new Token(user.getUserUU(), EXPIRES);
  98. tokenService.save(existToken);
  99. return success(existToken.getId());
  100. }
  101. /**
  102. * 通过邮箱校验,发送邮箱确认
  103. *
  104. * @return
  105. */
  106. @RequestMapping(value = "/check/email", method = RequestMethod.GET)
  107. public ModelMap checkByEmail(String operate, @RequestParam String email, String url) {
  108. // 校验空参数
  109. if (StringUtils.isEmpty(email)) {
  110. return error("邮箱不能为空");
  111. }
  112. // 根据邮箱找到用户
  113. UserAccount userAccount = SystemSession.getUserAccount();
  114. User user = userService.findOne(userAccount.getUserUU());
  115. // 设置发送邮件信息
  116. Token token = new Token(user.getUserUU(), EXPIRES);
  117. tokenService.save(token);
  118. ModelMap data = new ModelMap();
  119. data.put("vipName", user.getVipName());
  120. // TODO 邮件认证地址
  121. switch (operate) {
  122. case "mobile":
  123. data.put("type", "验证手机");
  124. data.put("url", url + (url.contains("?") ? "&" : "?") + "token=" + token.getId());
  125. break;
  126. case "email":
  127. data.put("type", "验证邮箱");
  128. data.put("url", url + (url.contains("?") ? "&" : "?") + "step=2&token=" + token.getId());
  129. break;
  130. case "question":
  131. data.put("type", "设置密保");
  132. data.put("url", getFrontUrl() + "/encrypted-setting/EncryptedSettingSecondStep?token=" + token.getId());
  133. break;
  134. default:
  135. return error("参数错误");
  136. }
  137. // 发送邮件
  138. if (!StringUtils.isEmpty(email)) {
  139. Setting mailTplId = settingService.findOne("templateForSendMailWhenResetPassword");
  140. if (!StringUtils.isEmpty(mailTplId)) {
  141. mailService.send(mailTplId.getValue(), email, data);
  142. }
  143. }
  144. return success();
  145. }
  146. /**
  147. * 修改用户信息,获取密保
  148. *
  149. * @author wangmh
  150. * @date 2018/1/15 16:19
  151. * @return
  152. */
  153. @RequestMapping(value = "/check/question", method = RequestMethod.GET)
  154. public ModelMap checkByQuestion() {
  155. UserAccount userAccount = SystemSession.getUserAccount();
  156. // 查询密保
  157. User user = userService.findOne(userAccount.getUserUU());
  158. List<UserQuestion> questions = user.getQuestions();
  159. // 将问题返回用户,答案放入session
  160. ModelMap data = new ModelMap();
  161. data.put("questions", questions);
  162. return success(data);
  163. }
  164. /**
  165. * 修改用户信息,认证密保
  166. * @param answers 密保答案
  167. * @return
  168. */
  169. @RequestMapping(value = "/check/question", method = RequestMethod.POST)
  170. public ModelMap checkByQuestion(String answers) {
  171. List<Map> answersArray = JSON.parseArray(answers, Map.class);
  172. // 校验密保答案
  173. User user = (User) request.getSession().getAttribute("user");
  174. List<UserQuestion> questions = user.getQuestions();
  175. Map<String, String> userAnswer = new HashMap<>(questions.size());
  176. for (UserQuestion question : questions) {
  177. userAnswer.put(question.getSort(), question.getAnswer());
  178. }
  179. for (Map<String, Object> answer : answersArray) {
  180. if (!answer.get("answer").equals(userAnswer.get(answer.get("sort")))){
  181. return error("答案错误");
  182. }
  183. }
  184. // 返回token
  185. Token expireToken = new Token(user.getUserUU(), EXPIRES);
  186. tokenService.save(expireToken);
  187. ModelMap data = new ModelMap();
  188. data.put("token", expireToken.getId());
  189. return success(data);
  190. }
  191. /**
  192. * 设置手机号校验获取验证码
  193. *
  194. * @param mobile 获取验证码手机号
  195. * @param token 第一步传递的tokenId
  196. * @return
  197. */
  198. @RequestMapping(value = "/setMobile", method = RequestMethod.GET)
  199. public ModelMap updateMobile(String mobile, @RequestParam String token) {
  200. // 校验token
  201. Token existToken = tokenService.findOne(token);
  202. if (existToken == null || existToken.isExpired()) {
  203. return error("为防止恶意修改,请从第一步开始校验");
  204. }
  205. // 拿出userUU,并删除token
  206. if (existToken.getBind() == null || !(existToken.getBind() instanceof Long)) {
  207. return error("请求错误");
  208. }
  209. Long userUU = (Long) existToken.getBind();
  210. User user = userService.findOne(userUU);
  211. // 获取验证码
  212. token = getMobileToken(mobile);
  213. request.getSession().setAttribute("user", user);
  214. ModelMap data = new ModelMap("token", token);
  215. data.put("code", request.getSession().getAttribute("code"));
  216. return success(data);
  217. }
  218. /**
  219. * 设置手机号
  220. *
  221. * @author wangmh
  222. * @date 2018/1/11 21:15
  223. * @param mobile 手机号
  224. * @param code 验证码
  225. * @param token 验证码tokenId
  226. * @return
  227. */
  228. @RequestMapping(value = "/setMobile", method = RequestMethod.POST)
  229. public ModelMap updateMobile(String mobile, String code, @RequestParam String token) {
  230. // 校验空参数
  231. Assert.hasText(mobile, "手机号不能为空");
  232. Assert.hasText(code, "验证码不能为空");
  233. // 从session中获取用户信息
  234. User user = (User) request.getSession().getAttribute("user");
  235. if (user == null) {
  236. return error("验证信息过期,请从第一步进行校验");
  237. }
  238. // 校验手机号是否被使用
  239. if (!mobile.equals(user.getMobile()) && userService.mobileHasRegistered(mobile)){
  240. return error("手机号已注册");
  241. }
  242. // 校验token
  243. Token existToken = tokenService.findOne(token);
  244. if (existToken == null) {
  245. return error("请重新获取验证码");
  246. }
  247. // 校验验证码
  248. checkMobileCode(token, mobile, code);
  249. // 修改手机号
  250. userService.updateMobile(user.getUserUU(), mobile);
  251. tokenService.delete(token);
  252. return success();
  253. }
  254. /**
  255. * 修改邮箱,获取校验邮箱验证码
  256. *
  257. * @author wangmh
  258. * @date 2018/1/11 20:16
  259. * @param email 邮箱
  260. * @return
  261. */
  262. @RequestMapping(value = "/setEmail", method = RequestMethod.GET)
  263. public ModelMap updateEmail(String email, @RequestParam String token, String url) {
  264. // 校验token
  265. Token existToken = tokenService.findOne(token);
  266. if (existToken == null || existToken.isExpired()) {
  267. return error("为防止恶意修改,请从第一步开始校验");
  268. }
  269. // 校验空参数
  270. if (StringUtils.isEmpty(email)) {
  271. return error("邮箱不能为空");
  272. }
  273. // 拿出userUU,并删除token
  274. if (existToken.getBind() == null || !(existToken.getBind() instanceof Long)) {
  275. return error("请求错误");
  276. }
  277. Long userUU = (Long) existToken.getBind();
  278. User user = userService.findOne(userUU);
  279. tokenService.delete(token);
  280. // 设置发送邮件信息
  281. Map<String, Object> tokenMap = new HashMap<>(2);
  282. tokenMap.put("userUU", userUU);
  283. tokenMap.put("newEmail", email);
  284. Token returnToken = new Token(tokenMap, EXPIRES);
  285. tokenService.save(returnToken);
  286. ModelMap data = new ModelMap();
  287. data.put("vipName", user.getVipName());
  288. // TODO 邮件认证地址
  289. data.put("type", "验证邮箱");
  290. if (url.contains("?")) {
  291. url = getFrontUrl() + "/update/user/email" + url.substring(url.indexOf("?"), url.length());
  292. } else {
  293. url = getFrontUrl() + "/update/user/email";
  294. }
  295. data.put("url", url + (url.contains("?") ? "&" : "?") + "step=2&token=" + returnToken.getId());
  296. // 发送邮件
  297. if (!StringUtils.isEmpty(email)) {
  298. Setting mailTplId = settingService.findOne("templateForSendMailWhenResetPassword");
  299. if (!StringUtils.isEmpty(mailTplId)) {
  300. mailService.send(mailTplId.getValue(), email, data);
  301. }
  302. }
  303. return success();
  304. }
  305. /**
  306. * 设置邮箱
  307. *
  308. * @author wangmh
  309. * @date 2018/1/11 21:15
  310. * @param token 验证tokenId
  311. * @return
  312. */
  313. @RequestMapping(value = "/email", method = RequestMethod.GET)
  314. public ModelAndView updateEmail(@RequestParam String token, String returnURL) {
  315. // 校验token
  316. Token existToken = tokenService.findOne(token);
  317. if (existToken == null || existToken.isExpired()) {
  318. // token过期,跳转到失败页面
  319. return new ModelAndView("redirect:"+ getFrontUrl() + "/validation/validFail" + (returnURL == null ? "" :"&returnURL=" + returnURL));
  320. }
  321. // 拿出userUU,并删除token
  322. if (existToken.getBind() == null || !(existToken.getBind() instanceof Map)) {
  323. // token错误,跳转到失败页面
  324. return new ModelAndView("redirect:"+ getFrontUrl() + "/validation/validFail?step=2&token=" + token + (returnURL == null ? "" :"&returnURL=" + returnURL));
  325. }
  326. Map<String, Object> data = (Map) existToken.getBind();
  327. Long userUU = (Long) data.get("userUU");
  328. String newEmail = (String) data.get("newEmail");
  329. userService.updateEmail(userUU, newEmail);
  330. // 删除token
  331. // tokenService.delete(token);
  332. return new ModelAndView("redirect:"+ getFrontUrl() + "/validation/emailValidation?step=3&token=" + token + (returnURL == null ? "" :"&returnURL=" + returnURL));
  333. }
  334. @RequestMapping(value = "/setQuestion", method = RequestMethod.POST)
  335. public ModelMap updateQuestion(@RequestParam String token, @RequestParam String userQuestions) {
  336. List<UserQuestion> questions = JSON.parseArray(userQuestions, UserQuestion.class);
  337. // 校验token
  338. if (StringUtils.isEmpty(token)) {
  339. return error("为防止恶意修改,请从第一步开始校验");
  340. }
  341. Token existToken = tokenService.findOne(token);
  342. if (existToken == null) {
  343. return error("验证超时,请重新验证");
  344. }
  345. tokenService.delete(token);
  346. // 拿出userUU,并删除token
  347. if (existToken.getBind() == null || !(existToken.getBind() instanceof Long)) {
  348. // token错误,跳转到失败页面
  349. return error("请求错误");
  350. }
  351. Long userUU = (Long) existToken.getBind();
  352. // 校验空参数
  353. if (CollectionUtils.isEmpty(questions)) {
  354. return error("密保不能为空");
  355. }
  356. // 设置密保
  357. userService.setQuestion(userUU, questions);
  358. return success();
  359. }
  360. /**
  361. * 校验验证码(只用于简单的校验,token不删除)
  362. * @param type 校验接收验证码类型(mobile or email)
  363. * @param token 验证码token
  364. * @param code 验证码
  365. * @param mobile 接收验证码手机号
  366. * @param email 接收验证码邮箱
  367. * @return
  368. */
  369. @RequestMapping(value = "/checkCode/{type}", method = RequestMethod.POST)
  370. public ModelMap checkCode(@PathVariable String type, @RequestParam String token, String code, String mobile, String email) {
  371. // 校验验证码
  372. switch (type) {
  373. case "mobile":
  374. if (StringUtils.isEmpty(mobile)) {
  375. return error("手机号不能为空");
  376. }
  377. checkMobileCode(token, mobile, code);
  378. break;
  379. case "email":
  380. if (StringUtils.isEmpty(email)) {
  381. return error("邮箱不能为空");
  382. }
  383. checkEmailCode(token, email, code);
  384. break;
  385. default:
  386. return error("参数错误");
  387. }
  388. return success();
  389. }
  390. /**
  391. * 设置手机号是校验手机号是否被注册
  392. * @param mobile 手机号
  393. * @return
  394. */
  395. @RequestMapping(value = "/mobile/hasRegister", method = RequestMethod.GET)
  396. public ModelMap checkMobile(String mobile) {
  397. UserAccount loginUser = SystemSession.getUserAccount();
  398. if (loginUser == null) {
  399. return error("未登录");
  400. }
  401. if (mobile.equals(loginUser.getMobile())) {
  402. return success(new ModelMap("hasRegister", false));
  403. }
  404. User user = userService.findByMobile(mobile);
  405. if (user != null) {
  406. return success(new ModelMap("hasRegister", true));
  407. }
  408. return success(new ModelMap("hasRegister", false));
  409. }
  410. /**
  411. * 设置邮箱时校验邮箱是否被注册
  412. * @param email 手机号
  413. * @return
  414. */
  415. @RequestMapping(value = "/email/hasRegister", method = RequestMethod.GET)
  416. public ModelMap checkEmail(String email) {
  417. UserAccount loginUser = SystemSession.getUserAccount();
  418. if (loginUser == null) {
  419. return error("未登录");
  420. }
  421. if (email.equals(loginUser.getEmail())) {
  422. return success(new ModelMap("hasRegister", false));
  423. }
  424. List<User> users = userService.findByEmail(email);
  425. if (!CollectionUtils.isEmpty(users)) {
  426. return success(new ModelMap("hasRegister", true));
  427. }
  428. return success(new ModelMap("hasRegister", false));
  429. }
  430. }