PersonalRegisterController.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  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.entity.register.SmsPersonalRegister;
  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.MessageUtils;
  22. import com.uas.sso.util.PasswordLevelUtils;
  23. import org.slf4j.Logger;
  24. import org.slf4j.LoggerFactory;
  25. import org.springframework.beans.factory.annotation.Autowired;
  26. import org.springframework.stereotype.Controller;
  27. import org.springframework.ui.ModelMap;
  28. import org.springframework.util.StringUtils;
  29. import org.springframework.web.bind.annotation.PostMapping;
  30. import org.springframework.web.bind.annotation.RequestMapping;
  31. import org.springframework.web.bind.annotation.RequestMethod;
  32. import org.springframework.web.bind.annotation.ResponseBody;
  33. import org.springframework.web.bind.annotation.RestController;
  34. import java.io.UnsupportedEncodingException;
  35. import java.net.URLDecoder;
  36. import java.util.List;
  37. import java.util.Optional;
  38. import java.util.Random;
  39. /**
  40. * 个人注册controller
  41. *
  42. * @author uas
  43. * @date 2018/1/2
  44. */
  45. @RestController
  46. @RequestMapping("/sso/personal/register")
  47. public class PersonalRegisterController extends BaseController {
  48. @Autowired
  49. private UserService userService;
  50. @Autowired
  51. private PersonalAccountService personalAccountService;
  52. @Autowired
  53. private AppService appService;
  54. private RegisterBufferedLogger registerLogger = LoggerManager.getLogger(RegisterBufferedLogger.class);
  55. private final static Logger LOGGER = LoggerFactory.getLogger(PersonalRegisterController.class);
  56. /**
  57. * 验证码存session的可以
  58. */
  59. private static final String RESET_CAPTCHA = "resetCaptcha";
  60. /**
  61. * 注册个人信息
  62. *
  63. * @param user 用户信息(需要会员名,手机号,手机号所属区域,密码)
  64. * @param appId 注册应用标志
  65. * @param code 验证码
  66. * @param token 验证码tokenId
  67. * @return 成功:success(),失败:error("错误码", "错误信息")
  68. */
  69. @RequestMapping(method = RequestMethod.POST)
  70. @ResponseBody
  71. public ModelMap register(User user, String appId, String code, String token, String baseUrl, String t, String returnUrl) throws UnsupportedEncodingException {
  72. // 获取参数
  73. String vipName = user.getVipName();
  74. String mobile = user.getMobile();
  75. String mobileArea = user.getMobileArea();
  76. String password = user.getPassword();
  77. // 参数空校验
  78. if (StringUtils.isEmpty(vipName)) {
  79. return error("会员名不能为空");
  80. }
  81. if (StringUtils.isEmpty(password)) {
  82. return error("密码不能为空");
  83. }
  84. if (StringUtils.isEmpty(mobile)) {
  85. return error("手机号不能为空");
  86. }
  87. // 校验手机号
  88. checkMobile(mobile, mobileArea);
  89. // 校验验证码
  90. checkMobileCode(token, mobile, code);
  91. // 校验密码
  92. if (PasswordStrength.WEAK.equals(PasswordLevelUtils.checkPasswordLevel(password))) {
  93. return error("密码须为8-20字符的英文、数字混合");
  94. }
  95. // 设置第三方id
  96. if (!StringUtils.isEmpty(t)) {
  97. Token unionidToken = tokenService.findOne(t);
  98. Optional<ForeignInfo> foreignInfo = Optional.ofNullable(unionidToken).map(value -> (ModelMap) unionidToken.getBind()).map(value -> (ForeignInfo) value.get("data"));
  99. if (!foreignInfo.isPresent()) {
  100. return error("参数错误,绑定失败");
  101. }
  102. userService.setForeignOpenId(user, foreignInfo.get());
  103. }
  104. // 注册并添加注册日志
  105. appId = StringUtils.isEmpty(appId) ? "sso" : appId;
  106. user.setFromIp(IpUtils.getIp(request));
  107. user.setFromUrl(URLDecoder.decode(returnUrl, "utf-8"));
  108. user = userService.register(user, appId);
  109. registerLogger.info(Type.REGISTER_PERSONAL.getValue(), Step.FIRST.getValue(), "个人注册成功", user, user.getFromApp());
  110. // 注册成功后删除验证码token
  111. if (!StringUtils.isEmpty(t)) {
  112. tokenService.delete(t);
  113. }
  114. tokenService.delete(token);
  115. App app = appService.findOne(appId);
  116. if ("mall".equals(appId)) {
  117. UserAccount userAccount = personalAccountService.findOneByUserUU(appId, user.getUserUU());
  118. userAccount.setLastLoginTime(System.currentTimeMillis());
  119. List<String> loginUrls = appService.findAllLoginUrl();
  120. ModelMap data = new ModelMap();
  121. data.addAttribute("data", userAccount)
  122. .addAttribute("loginUrls", loginUrls)
  123. .addAttribute("currentUrl", baseUrl)
  124. .addAttribute("type", "mall");
  125. SSOToken st = new SSOToken(request, userAccount.getMobile());
  126. st.setData(JSON.toJSONString(userAccount));
  127. SSOHelper.setSSOCookie(request, response, st, true);
  128. LOGGER.info("用户({})注册并登录成功,时间:{}", user.getUserUU(), System.currentTimeMillis());
  129. return success(data);
  130. } else if ("city".equals(appId) || "city".equals(app == null ? "" : app.getUserControl())) {
  131. UserAccount userAccount = personalAccountService.findOneByUserUU(appId, user.getUserUU());
  132. userAccount.setLastLoginTime(System.currentTimeMillis());
  133. List<String> loginUrls = appService.findAllLoginUrl();
  134. ModelMap data = new ModelMap();
  135. data.addAttribute("data", userAccount)
  136. .addAttribute("loginUrls", loginUrls)
  137. .addAttribute("currentUrl", baseUrl)
  138. .addAttribute("type", "city");
  139. data.addAttribute("bgImage", "https://dfs.ubtob.com/group1/M00/88/AE/CgpkyFsPxC-ADHD8ACBM14PiAS8632.png")
  140. .addAttribute("type", "city");
  141. SSOToken st = new SSOToken(request, userAccount.getMobile());
  142. st.setData(JSON.toJSONString(userAccount));
  143. SSOHelper.setSSOCookie(request, response, st, true);
  144. LOGGER.info("用户({})注册并登录成功,时间:{}", user.getUserUU(), System.currentTimeMillis());
  145. return success(data);
  146. }
  147. // 设置返回数据
  148. LOGGER.info("用户({})注册成功,时间:{}", user.getUserUU(), System.currentTimeMillis());
  149. return success(new ModelMap("userUU", user.getUserUU()));
  150. }
  151. @PostMapping("/sms")
  152. public ModelMap register(SmsPersonalRegister personalRegister) throws UnsupportedEncodingException {
  153. User user = new User();
  154. String mobile = personalRegister.getMobile();
  155. String password = getPassword(mobile.substring(mobile.length() - 3, mobile.length()));
  156. user.setVipName(mobile);
  157. user.setMobile(mobile);
  158. user.setPassword(password);
  159. ModelMap response = register(user, personalRegister.getAppId(), personalRegister.getCode(), personalRegister.getToken(),
  160. personalRegister.getBaseUrl(), personalRegister.getT(), personalRegister.getReturnUrl());
  161. MessageUtils.sendSms("templateForSendSmsAfterRegisterSuccess", mobile, mobile, password);
  162. return response;
  163. }
  164. /**
  165. * 获取密码
  166. * @param suffix 密码后缀
  167. * @return
  168. */
  169. private String getPassword(String suffix) {
  170. Random random = new Random();
  171. String val = "";
  172. // 生成4个字母
  173. for (int i=0; i<3; i++) {
  174. int choice = random.nextInt(2) % 2 == 0 ? 65 : 97;
  175. val = val + (char)(choice + random.nextInt(26));
  176. }
  177. // 3个数字
  178. String number = random.nextInt(999) + 1000 + "";
  179. number = number.substring(number.length() - 3, number.length());
  180. val = val + number;
  181. // 后缀
  182. val = val + suffix;
  183. return val;
  184. }
  185. /**
  186. * 获取验证码
  187. *
  188. * @param mobile 手机号
  189. * @return success(tokenId)
  190. */
  191. @RequestMapping(value = "/checkCode", method = RequestMethod.GET)
  192. @ResponseBody
  193. public ModelMap getCode(String mobile, String code) {
  194. // 参数校验
  195. if (StringUtils.isEmpty(mobile)) {
  196. return error("请输入手机号");
  197. }
  198. // 校验图片验证码
  199. Token captchaToken = tokenService.findOne(request.getSession().getId());
  200. if (captchaToken == null) {
  201. return error("图片验证码过期");
  202. }
  203. if (code != null && !code.equalsIgnoreCase((String) captchaToken.getBind())) {
  204. return error("请输入正确的验证码");
  205. }
  206. tokenService.delete(request.getSession().getId());
  207. // 校验发送短信频率,60秒一次,key为#{sessionId}_#{类名}
  208. String key = request.getSession().getId() + "_" + this.getClass().getSimpleName();
  209. Token rateToken = tokenService.findOne(key);
  210. if (rateToken != null) {
  211. return error("验证码发送间隔过快");
  212. }
  213. // 获取验证码
  214. String token = getMobileToken(mobile);
  215. // 设置发送短信频率
  216. rateToken = new Token(key, "", 60);
  217. tokenService.save(rateToken);
  218. // 设置返回数据
  219. ModelMap data = new ModelMap();
  220. data.put("token", token);
  221. data.put("code", request.getSession().getAttribute("code"));
  222. request.getSession().setAttribute("token", token);
  223. return data;
  224. }
  225. /**
  226. * 校验验证码
  227. *
  228. * @param code 验证码
  229. * @param token 验证码tokenId
  230. * @return 验证成功:success(),验证失败:error("错误信息")
  231. */
  232. @RequestMapping(value = "/checkCode", method = RequestMethod.POST)
  233. @ResponseBody
  234. public ModelMap checkCode(String token, String mobile, String code) {
  235. // 校验token是否正确
  236. String sessionToken = (String) request.getSession().getAttribute("token");
  237. if (StringUtils.isEmpty(sessionToken) || !sessionToken.equals(token)) {
  238. return error("请重新获取验证码");
  239. }
  240. // 校验验证码
  241. checkMobileCode(token, mobile, code);
  242. // 设置返回值
  243. return success();
  244. }
  245. }