UserspaceRegisterController.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. package com.uas.sso.controller;
  2. import com.alibaba.fastjson.JSON;
  3. import com.uas.sso.AccountConfig;
  4. import com.uas.sso.SSOHelper;
  5. import com.uas.sso.SSOToken;
  6. import com.uas.sso.foreign.bihe.entity.BiHeInfo;
  7. import com.uas.sso.core.PasswordStrength;
  8. import com.uas.sso.core.Status;
  9. import com.uas.sso.core.Step;
  10. import com.uas.sso.core.Type;
  11. import com.uas.sso.entity.*;
  12. import com.uas.sso.foreign.entity.ForeignInfo;
  13. import com.uas.sso.logging.LoggerManager;
  14. import com.uas.sso.logging.RegisterBufferedLogger;
  15. import com.uas.sso.service.AppService;
  16. import com.uas.sso.service.UserAccountService;
  17. import com.uas.sso.service.UserService;
  18. import com.uas.sso.service.UserspaceService;
  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 wangmh
  39. * @date 2018/1/4
  40. */
  41. @RequestMapping("/sso/userspace/register")
  42. @Controller
  43. public class UserspaceRegisterController extends BaseController {
  44. @Autowired
  45. private UserService userService;
  46. @Autowired
  47. private UserspaceService userspaceService;
  48. @Autowired
  49. private UserAccountService userAccountService;
  50. @Autowired
  51. private AppService appService;
  52. private RegisterBufferedLogger registerLogger = LoggerManager.getLogger(RegisterBufferedLogger.class);
  53. private final static Logger LOGGER = LoggerFactory.getLogger(UserspaceRegisterController.class);
  54. /**
  55. * 重置密码验证码存session的key
  56. */
  57. private static final String RESET_CAPTCHA = "resetCaptcha";
  58. /**
  59. * 企业注册第一步,验证手机号
  60. *
  61. * @param mobile 手机号
  62. * @param code 验证码
  63. * @param token 验证码tokenId
  64. * @return
  65. */
  66. @RequestMapping(value = "/checkAdminTel", method = RequestMethod.POST)
  67. @ResponseBody
  68. public ModelMap checkAdminTel(String mobile, String code, String token, String appId) {
  69. // 校验验证码
  70. checkMobileCode(token, mobile, code);
  71. // 设置返回数据
  72. ModelMap data = new ModelMap();
  73. User user = userService.findByMobile(mobile);
  74. if (user == null) {
  75. data.put("hasRegister", false);
  76. } else {
  77. data.put("hasRegister", true);
  78. data.put("hasEmail", !StringUtils.isEmpty(user.getEmail()));
  79. }
  80. request.getSession().setAttribute("mobile", mobile);
  81. // 删除token
  82. tokenService.delete(token);
  83. // 添加日志
  84. appId = StringUtils.isEmpty(appId) ? AccountConfig.ACCOUNT_CENTER : appId;
  85. registerLogger.info(Type.REGISTER_USERSPACE.getValue(), Step.FIRST.getValue(), "企业注册", mobile, appId);
  86. return success(data);
  87. }
  88. /**
  89. * 企业注册第二步,填写企业信息
  90. *
  91. * @param userspace 企业信息
  92. * @return
  93. */
  94. @RequestMapping(method = RequestMethod.POST)
  95. @ResponseBody
  96. public ModelMap register(Userspace userspace, User user, String appId, String baseUrl, String t, String returnUrl) throws UnsupportedEncodingException {
  97. // 获取企业信息
  98. String spaceName = userspace.getSpaceName();
  99. String businessCode = userspace.getBusinessCode();
  100. String adminName = user.getVipName();
  101. String password = user.getPassword();
  102. String adminEmail = user.getEmail();
  103. // 校验参数
  104. appId = StringUtils.isEmpty(appId) ? AccountConfig.ACCOUNT_CENTER : appId;
  105. String mobile = (String) request.getSession().getAttribute("mobile");
  106. if (StringUtils.isEmpty(mobile)) {
  107. return error("请刷新后重试");
  108. }
  109. if (StringUtils.isEmpty(spaceName)) {
  110. return error("请填写正确的企业名称");
  111. }
  112. if (StringUtils.isEmpty(businessCode)) {
  113. return error("请填写正确的企业营业执照号");
  114. }
  115. if (StringUtils.isEmpty(password)) {
  116. return error("密码不能为空");
  117. }
  118. User admin = userService.findByMobile(mobile);
  119. if (admin == null) {
  120. // 新用户: 管理员名称,密码不能为空
  121. if (StringUtils.isEmpty(adminName)) {
  122. return error("请填写正确的管理员名称");
  123. }
  124. // 新用户要校验密码强度
  125. PasswordStrength strength = PasswordLevelUtils.checkPasswordLevel(password);
  126. if (PasswordStrength.WEAK.getValue() == strength.getValue()) {
  127. return error("密码须为8-20字符的英文、数字混合");
  128. }
  129. }
  130. // 设置企业管理员信息
  131. if (admin == null) {
  132. // 新用户直接注册
  133. admin = new User();
  134. admin.setMobile(mobile);
  135. admin.setVipName(adminName);
  136. admin.setPassword(password);
  137. admin.setEmail(adminEmail);
  138. } else {
  139. // 老用户校验密码
  140. userService.checkPassword(admin.getUserUU(), user.getPassword(), false);
  141. // 老用户邮箱不为已认证的话设置邮箱
  142. if (admin.getEmailValidCode() != Status.AUTHENTICATED.getCode()) {
  143. admin.setEmail(adminEmail);
  144. admin.setEmailValidCode((short) Status.NOT_APPLYING.getCode());
  145. }
  146. }
  147. // 设置第三方id
  148. if (!StringUtils.isEmpty(t)) {
  149. Token unionidToken = tokenService.findOne(t);
  150. Optional<ForeignInfo> foreignInfo = Optional.ofNullable(unionidToken).map(value -> (ModelMap) unionidToken.getBind()).map(value -> (ForeignInfo) value.get("data"));
  151. if (!foreignInfo.isPresent()) {
  152. return error("参数错误,绑定失败");
  153. }
  154. userService.setForeignOpenId(user, foreignInfo.get());
  155. }
  156. // 企业注册
  157. userspace.setAdmin(admin);
  158. admin.setFromIp(IpUtils.getIp(request));
  159. admin.setFromUrl(URLDecoder.decode(returnUrl, "utf-8"));
  160. userspace = userspaceService.register(userspace, appId);
  161. tokenService.delete(t);
  162. // 发送邮件和短信
  163. ModelMap info = new ModelMap();
  164. info.addAttribute("enname", userspace.getSpaceName());
  165. info.addAttribute("enuu", userspace.getSpaceUU());
  166. sendEmail("templateForSendMailAfterRegister", admin.getEmail(), info);
  167. sendSms("templateForSendSmsAfterRegister", admin.getMobile(), userspace.getSpaceName(), userspace.getSpaceUU());
  168. // 添加日志
  169. registerLogger.info(Type.REGISTER_USERSPACE.getValue(), Step.SECOND.getValue(), "企业注册", userspace, appId);
  170. App app = appService.findOne(appId);
  171. if ("mall".equals(appId)) {
  172. UserAccount userAccount = userAccountService.findOneByUserUU(appId, admin.getUserUU(), userspace.getSpaceUU());
  173. userAccount.setLastLoginTime(System.currentTimeMillis());
  174. List<String> loginUrls = appService.findAllLoginUrl();
  175. ModelMap data = new ModelMap();
  176. data.addAttribute("data", userAccount)
  177. .addAttribute("loginUrls", loginUrls)
  178. .addAttribute("currentUrl", baseUrl)
  179. .addAttribute("type", "mall");
  180. SSOToken st = new SSOToken(request, userAccount.getMobile());
  181. st.setData(JSON.toJSONString(userAccount));
  182. SSOHelper.setSSOCookie(request, response, st, true);
  183. LOGGER.info("用户({})注册并登录成功,时间:{}", user.getUserUU(), System.currentTimeMillis());
  184. return success(data);
  185. } else if ("city".equals(appId) || "city".equals(app.getUserControl())) {
  186. UserAccount userAccount = userAccountService.findOneByUserUU(appId, admin.getUserUU(), userspace.getSpaceUU());
  187. userAccount.setLastLoginTime(System.currentTimeMillis());
  188. List<String> loginUrls = appService.findAllLoginUrl();
  189. ModelMap data = new ModelMap();
  190. data.addAttribute("bgImage", "https://dfs.ubtob.com/group1/M00/88/AE/CgpkyFsPxC-ADHD8ACBM14PiAS8632.png")
  191. .addAttribute("type", "city");
  192. data.addAttribute("data", userAccount)
  193. .addAttribute("loginUrls", loginUrls)
  194. .addAttribute("currentUrl", baseUrl);
  195. SSOToken st = new SSOToken(request, userAccount.getMobile());
  196. st.setData(JSON.toJSONString(userAccount));
  197. SSOHelper.setSSOCookie(request, response, st, true);
  198. LOGGER.info("用户({})注册并登录成功,时间:{}", user.getUserUU(), System.currentTimeMillis());
  199. return success(data);
  200. }
  201. LOGGER.info("用户({})注册成功,时间:{}", user.getUserUU(), System.currentTimeMillis());
  202. return success();
  203. }
  204. /**
  205. * 获取验证码
  206. *
  207. * @param mobile 手机号
  208. * @param mobileArea
  209. * @return success(tokenId)
  210. */
  211. @RequestMapping(value = "/checkCode", method = RequestMethod.GET)
  212. @ResponseBody
  213. public ModelMap getCode(String mobile, String mobileArea, String timestamp, String code) {
  214. if (StringUtils.isEmpty(timestamp)){
  215. return error("恶意访问");
  216. }
  217. // 校验图片验证码
  218. Token captchaToken = tokenService.findOne(request.getSession().getId());
  219. if (captchaToken == null) {
  220. return error("图片验证码过期");
  221. }
  222. if (code != null && !code.equalsIgnoreCase((String) captchaToken.getBind())) {
  223. return error("请输入正确的验证码");
  224. }
  225. tokenService.delete(request.getSession().getId());
  226. // 校验手机号
  227. checkMobile(mobile, mobileArea);
  228. // 获取验证码
  229. String token = getMobileToken(mobile);
  230. // 设置返回数据
  231. ModelMap data = new ModelMap();
  232. data.put("token", token);
  233. data.put("code", request.getSession().getAttribute("code"));
  234. request.getSession().setAttribute("token", token);
  235. return data;
  236. }
  237. /**
  238. * 校验验证码
  239. *
  240. * @param code 验证码
  241. * @param token 验证码tokenId
  242. * @return 验证成功:success()
  243. */
  244. @RequestMapping(value = "/checkCode", method = RequestMethod.POST)
  245. @ResponseBody
  246. public ModelMap checkCode(String token, String mobile, String code) {
  247. // 校验token是否正确
  248. String sessionToken = (String) request.getSession().getAttribute("token");
  249. if (StringUtils.isEmpty(sessionToken) || !sessionToken.equals(token)) {
  250. return error("请重新获取验证码");
  251. }
  252. // 校验验证码
  253. checkMobileCode(token, mobile, code);
  254. // 设置返回值
  255. return success();
  256. }
  257. }