PersonalRegisterController.java 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. package com.uas.sso.controller;
  2. import com.alibaba.fastjson.JSON;
  3. import com.uas.sso.SSOHelper;
  4. import com.uas.sso.SSOToken;
  5. import com.uas.sso.foreign.bihe.entity.BiHeInfo;
  6. import com.uas.sso.core.Step;
  7. import com.uas.sso.core.Type;
  8. import com.uas.sso.core.PasswordStrength;
  9. import com.uas.sso.entity.App;
  10. import com.uas.sso.entity.Token;
  11. import com.uas.sso.entity.User;
  12. import com.uas.sso.entity.UserAccount;
  13. import com.uas.sso.foreign.entity.ForeignInfo;
  14. import com.uas.sso.logging.LoggerManager;
  15. import com.uas.sso.logging.RegisterBufferedLogger;
  16. import com.uas.sso.service.AppService;
  17. import com.uas.sso.service.PersonalAccountService;
  18. import com.uas.sso.service.UserService;
  19. import com.uas.sso.util.CaptchaUtil;
  20. import com.uas.sso.util.IpUtils;
  21. import com.uas.sso.util.PasswordLevelUtils;
  22. import org.slf4j.Logger;
  23. import org.slf4j.LoggerFactory;
  24. import org.springframework.beans.factory.annotation.Autowired;
  25. import org.springframework.stereotype.Controller;
  26. import org.springframework.ui.ModelMap;
  27. import org.springframework.util.StringUtils;
  28. import org.springframework.web.bind.annotation.RequestMapping;
  29. import org.springframework.web.bind.annotation.RequestMethod;
  30. import org.springframework.web.bind.annotation.ResponseBody;
  31. import java.io.UnsupportedEncodingException;
  32. import java.net.URLDecoder;
  33. import java.util.List;
  34. import java.util.Optional;
  35. /**
  36. * 个人注册controller
  37. *
  38. * @author uas
  39. * @date 2018/1/2
  40. */
  41. @Controller
  42. @RequestMapping("/sso/personal/register")
  43. public class PersonalRegisterController extends BaseController {
  44. @Autowired
  45. private UserService userService;
  46. @Autowired
  47. private PersonalAccountService personalAccountService;
  48. @Autowired
  49. private AppService appService;
  50. private RegisterBufferedLogger registerLogger = LoggerManager.getLogger(RegisterBufferedLogger.class);
  51. private final static Logger LOGGER = LoggerFactory.getLogger(PersonalRegisterController.class);
  52. /**
  53. * 验证码存session的可以
  54. */
  55. private static final String RESET_CAPTCHA = "resetCaptcha";
  56. /**
  57. * 注册个人信息
  58. *
  59. * @param user 用户信息(需要会员名,手机号,手机号所属区域,密码)
  60. * @param appId 注册应用标志
  61. * @param code 验证码
  62. * @param token 验证码tokenId
  63. * @return 成功:success(),失败:error("错误码", "错误信息")
  64. */
  65. @RequestMapping(method = RequestMethod.POST)
  66. @ResponseBody
  67. public ModelMap register(User user, String appId, String code, String token, String baseUrl, String t, String returnUrl) throws UnsupportedEncodingException {
  68. // 获取参数
  69. String vipName = user.getVipName();
  70. String mobile = user.getMobile();
  71. String mobileArea = user.getMobileArea();
  72. String password = user.getPassword();
  73. // 参数空校验
  74. if (StringUtils.isEmpty(vipName)) {
  75. return error("会员名不能为空");
  76. }
  77. if (StringUtils.isEmpty(password)) {
  78. return error("密码不能为空");
  79. }
  80. if (StringUtils.isEmpty(mobile)) {
  81. return error("手机号不能为空");
  82. }
  83. // 校验手机号
  84. checkMobile(mobile, mobileArea);
  85. // 校验验证码
  86. checkMobileCode(token, mobile, code);
  87. // 校验密码
  88. if (PasswordStrength.WEAK.equals(PasswordLevelUtils.checkPasswordLevel(password))) {
  89. return error("密码须为8-20字符的英文、数字混合");
  90. }
  91. // 设置第三方id
  92. if (!StringUtils.isEmpty(t)) {
  93. Token unionidToken = tokenService.findOne(t);
  94. Optional<ForeignInfo> foreignInfo = Optional.ofNullable(unionidToken).map(value -> (ModelMap) unionidToken.getBind()).map(value -> (ForeignInfo) value.get("data"));
  95. if (!foreignInfo.isPresent()) {
  96. return error("参数错误,绑定失败");
  97. }
  98. userService.setForeignOpenId(user, foreignInfo.get());
  99. }
  100. // 注册并添加注册日志
  101. appId = StringUtils.isEmpty(appId) ? "sso" : appId;
  102. user.setFromIp(IpUtils.getIp(request));
  103. user.setFromUrl(URLDecoder.decode(returnUrl, "utf-8"));
  104. user = userService.register(user, appId);
  105. registerLogger.info(Type.REGISTER_PERSONAL.getValue(), Step.FIRST.getValue(), "个人注册成功", user, user.getFromApp());
  106. // 注册成功后删除验证码token
  107. if (!StringUtils.isEmpty(t)) {
  108. tokenService.delete(t);
  109. }
  110. tokenService.delete(token);
  111. App app = appService.findOne(appId);
  112. if ("mall".equals(appId)) {
  113. UserAccount userAccount = personalAccountService.findOneByUserUU(appId, user.getUserUU());
  114. userAccount.setLastLoginTime(null);
  115. List<String> loginUrls = appService.findAllLoginUrl();
  116. ModelMap data = new ModelMap();
  117. data.addAttribute("data", userAccount)
  118. .addAttribute("loginUrls", loginUrls)
  119. .addAttribute("currentUrl", baseUrl)
  120. .addAttribute("type", "mall");
  121. SSOToken st = new SSOToken(request, userAccount.getMobile());
  122. st.setData(JSON.toJSONString(userAccount));
  123. SSOHelper.setSSOCookie(request, response, st, true);
  124. LOGGER.info("用户({})注册并登录成功,时间:{}", user.getUserUU(), System.currentTimeMillis());
  125. return success(data);
  126. } else if ("city".equals(appId) || "city".equals(app == null ? "" : app.getUserControl())) {
  127. UserAccount userAccount = personalAccountService.findOneByUserUU(appId, user.getUserUU());
  128. userAccount.setLastLoginTime(null);
  129. List<String> loginUrls = appService.findAllLoginUrl();
  130. ModelMap data = new ModelMap();
  131. data.addAttribute("data", userAccount)
  132. .addAttribute("loginUrls", loginUrls)
  133. .addAttribute("currentUrl", baseUrl)
  134. .addAttribute("type", "city");
  135. data.addAttribute("bgImage", "https://dfs.ubtob.com/group1/M00/88/AE/CgpkyFsPxC-ADHD8ACBM14PiAS8632.png")
  136. .addAttribute("type", "city");
  137. SSOToken st = new SSOToken(request, userAccount.getMobile());
  138. st.setData(JSON.toJSONString(userAccount));
  139. SSOHelper.setSSOCookie(request, response, st, true);
  140. LOGGER.info("用户({})注册并登录成功,时间:{}", user.getUserUU(), System.currentTimeMillis());
  141. return success(data);
  142. }
  143. // 设置返回数据
  144. LOGGER.info("用户({})注册成功,时间:{}", user.getUserUU(), System.currentTimeMillis());
  145. return success(new ModelMap("userUU", user.getUserUU()));
  146. }
  147. /**
  148. * 获取验证码
  149. *
  150. * @param mobile 手机号
  151. * @return success(tokenId)
  152. */
  153. @RequestMapping(value = "/checkCode", method = RequestMethod.GET)
  154. @ResponseBody
  155. public ModelMap getCode(String mobile, String code) {
  156. // 参数校验
  157. if (StringUtils.isEmpty(mobile)) {
  158. return error("请输入手机号");
  159. }
  160. // 校验图片验证码
  161. CaptchaUtil.checkCode(request, RESET_CAPTCHA, code);
  162. // 获取验证码
  163. String token = getMobileToken(mobile);
  164. // 设置返回数据
  165. ModelMap data = new ModelMap();
  166. data.put("token", token);
  167. data.put("code", request.getSession().getAttribute("code"));
  168. request.getSession().setAttribute("token", token);
  169. return data;
  170. }
  171. /**
  172. * 校验验证码
  173. *
  174. * @param code 验证码
  175. * @param token 验证码tokenId
  176. * @return 验证成功:success(),验证失败:error("错误信息")
  177. */
  178. @RequestMapping(value = "/checkCode", method = RequestMethod.POST)
  179. @ResponseBody
  180. public ModelMap checkCode(String token, String mobile, String code) {
  181. // 校验token是否正确
  182. String sessionToken = (String) request.getSession().getAttribute("token");
  183. if (StringUtils.isEmpty(sessionToken) || !sessionToken.equals(token)) {
  184. return error("请重新获取验证码");
  185. }
  186. // 校验验证码
  187. checkMobileCode(token, mobile, code);
  188. // 设置返回值
  189. return success();
  190. }
  191. }