UserspaceRegisterController.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  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.entity.register.AdminUserspaceRegister;
  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.sync.service.SyncSsoService;
  20. import com.uas.sso.util.CaptchaUtil;
  21. import com.uas.sso.util.IpUtils;
  22. import com.uas.sso.util.PasswordLevelUtils;
  23. import com.uas.sso.util.StringUtil;
  24. import com.uas.sso.util.encry.Md5Utils;
  25. import org.slf4j.Logger;
  26. import org.slf4j.LoggerFactory;
  27. import org.springframework.beans.factory.annotation.Autowired;
  28. import org.springframework.ui.ModelMap;
  29. import org.springframework.util.StringUtils;
  30. import org.springframework.web.bind.annotation.PostMapping;
  31. import org.springframework.web.bind.annotation.RequestMapping;
  32. import org.springframework.web.bind.annotation.RequestMethod;
  33. import org.springframework.web.bind.annotation.RequestParam;
  34. import org.springframework.web.bind.annotation.ResponseBody;
  35. import org.springframework.web.bind.annotation.RestController;
  36. import java.io.UnsupportedEncodingException;
  37. import java.net.URLDecoder;
  38. import java.util.List;
  39. import java.util.Optional;
  40. /**
  41. * 企业注册controller
  42. *
  43. * @author wangmh
  44. * @date 2018/1/4
  45. */
  46. @RequestMapping("/sso/userspace/register")
  47. @RestController
  48. public class UserspaceRegisterController extends BaseController {
  49. @Autowired
  50. private UserService userService;
  51. @Autowired
  52. private UserspaceService userspaceService;
  53. @Autowired
  54. private UserAccountService userAccountService;
  55. @Autowired
  56. private AppService appService;
  57. @Autowired
  58. private SyncSsoService syncSsoService;
  59. private RegisterBufferedLogger registerLogger = LoggerManager.getLogger(RegisterBufferedLogger.class);
  60. private final static Logger LOGGER = LoggerFactory.getLogger(UserspaceRegisterController.class);
  61. /**
  62. * 重置密码验证码存session的key
  63. */
  64. private static final String RESET_CAPTCHA = "resetCaptcha";
  65. /**
  66. * 企业注册第一步,验证手机号
  67. *
  68. * @param mobile 手机号
  69. * @param code 验证码
  70. * @param token 验证码tokenId
  71. * @return
  72. */
  73. @RequestMapping(value = "/checkAdminTel", method = RequestMethod.POST)
  74. @ResponseBody
  75. public ModelMap checkAdminTel(String mobile, String code, String token, String appId) {
  76. // 校验验证码
  77. checkMobileCode(token, mobile, code);
  78. // 设置返回数据
  79. ModelMap data = new ModelMap();
  80. User user = userService.findByMobile(mobile);
  81. if (user == null) {
  82. data.put("hasRegister", false);
  83. } else {
  84. data.put("hasRegister", true);
  85. data.put("hasEmail", !StringUtils.isEmpty(user.getEmail()));
  86. }
  87. request.getSession().setAttribute("mobile", mobile);
  88. // 删除token
  89. tokenService.delete(token);
  90. // 添加日志
  91. appId = StringUtils.isEmpty(appId) ? AccountConfig.ACCOUNT_CENTER : appId;
  92. registerLogger.info(Type.REGISTER_USERSPACE.getValue(), Step.FIRST.getValue(), "企业注册", mobile, appId);
  93. return success(data);
  94. }
  95. /**
  96. * 企业注册第二步,填写企业信息
  97. *
  98. * @param userspace 企业信息
  99. * @return
  100. */
  101. @RequestMapping(method = RequestMethod.POST)
  102. public ModelMap register(Userspace userspace, User user, String appId, String baseUrl, String t, String returnUrl, @RequestParam(defaultValue = "false") boolean isEncry) throws UnsupportedEncodingException {
  103. // 获取企业信息
  104. String spaceName = userspace.getSpaceName();
  105. String businessCode = userspace.getBusinessCode();
  106. String adminName = user.getVipName();
  107. String password = user.getPassword();
  108. String adminEmail = user.getEmail();
  109. // 校验参数
  110. appId = StringUtils.isEmpty(appId) ? AccountConfig.ACCOUNT_CENTER : appId;
  111. String mobile = (String) request.getSession().getAttribute("mobile");
  112. if (StringUtils.isEmpty(mobile)) {
  113. return error("请刷新后重试");
  114. }
  115. if (StringUtils.isEmpty(spaceName)) {
  116. return error("请填写正确的企业名称");
  117. }
  118. if (StringUtils.isEmpty(businessCode)) {
  119. return error("请填写正确的企业营业执照号");
  120. }
  121. if (StringUtils.isEmpty(password)) {
  122. return error("密码不能为空");
  123. }
  124. User admin = userService.findByMobile(mobile);
  125. if (admin == null) {
  126. // 新用户: 管理员名称,密码不能为空
  127. if (StringUtils.isEmpty(adminName)) {
  128. return error("请填写正确的管理员名称");
  129. }
  130. // 新用户要校验密码强度
  131. PasswordStrength strength = PasswordLevelUtils.checkPasswordLevel(password);
  132. if (PasswordStrength.WEAK.getValue() == strength.getValue()) {
  133. return error("密码须为8-20字符的英文、数字混合");
  134. }
  135. }
  136. // 设置企业管理员信息
  137. if (admin == null) {
  138. // 新用户直接注册
  139. admin = new User();
  140. admin.setMobile(mobile);
  141. admin.setVipName(adminName);
  142. admin.setPassword(password);
  143. admin.setEmail(adminEmail);
  144. } else {
  145. // 老用户校验密码
  146. userService.checkPassword(admin.getUserUU(), user.getPassword(), isEncry);
  147. // 老用户邮箱不为已认证的话设置邮箱
  148. if (admin.getEmailValidCode() != Status.AUTHENTICATED.getCode()) {
  149. admin.setEmail(adminEmail);
  150. admin.setEmailValidCode((short) Status.NOT_APPLYING.getCode());
  151. }
  152. }
  153. // 设置第三方id
  154. if (!StringUtils.isEmpty(t)) {
  155. Token unionidToken = tokenService.findOne(t);
  156. Optional<ForeignInfo> foreignInfo = Optional.ofNullable(unionidToken).map(value -> (ModelMap) unionidToken.getBind()).map(value -> (ForeignInfo) value.get("data"));
  157. if (!foreignInfo.isPresent()) {
  158. return error("参数错误,绑定失败");
  159. }
  160. userService.setForeignOpenId(user, foreignInfo.get());
  161. }
  162. // 企业注册
  163. userspace.setAdmin(admin);
  164. admin.setFromIp(IpUtils.getIp(request));
  165. admin.setFromUrl(URLDecoder.decode(returnUrl, "utf-8"));
  166. userspace = userspaceService.register(userspace, appId);
  167. if (!StringUtils.isEmpty(t)) {
  168. tokenService.delete(t);
  169. }
  170. // 发送邮件和短信
  171. ModelMap info = new ModelMap();
  172. info.addAttribute("enname", userspace.getSpaceName());
  173. info.addAttribute("enuu", userspace.getSpaceUU());
  174. sendEmail("templateForSendMailAfterRegister", admin.getEmail(), info);
  175. sendSms("templateForSendSmsAfterRegister", admin.getMobile(), userspace.getSpaceName(), userspace.getSpaceUU());
  176. // 添加日志
  177. registerLogger.info(Type.REGISTER_USERSPACE.getValue(), Step.SECOND.getValue(), "企业注册", userspace, appId);
  178. // 判断应用是否存在
  179. App app = appService.findOne(appId);
  180. if (app == null) {
  181. LOGGER.warn("企业注册,应用{}不存在,注册企业:{}", appId, userspace.getSpaceUU());
  182. return success();
  183. }
  184. // 登录并返回数据
  185. UserAccount userAccount = userAccountService.findOneByUserUU(appId, admin.getUserUU(), userspace.getSpaceUU());
  186. userAccount.setLastLoginTime(System.currentTimeMillis());
  187. List<String> loginUrls = appService.findAllLoginUrl();
  188. ModelMap data = new ModelMap();
  189. data.addAttribute("data", userAccount)
  190. .addAttribute("loginUrls", loginUrls)
  191. .addAttribute("currentUrl", baseUrl);
  192. SSOToken st = new SSOToken(request, userAccount.getMobile());
  193. st.setData(JSON.toJSONString(userAccount));
  194. SSOHelper.setSSOCookie(request, response, st, true);
  195. syncSsoService.sendUserLoginStateToSso(userspace.getSpaceUU(), userspace.getAdminUU(), response, null);
  196. LOGGER.info("用户({})注册并登录成功,时间:{}", admin.getUserUU(), System.currentTimeMillis());
  197. return success(data);
  198. }
  199. /**
  200. * 通过登录管理员注册企业
  201. * @return
  202. * @throws UnsupportedEncodingException
  203. */
  204. @PostMapping("/admin")
  205. public ModelMap registerLogin(AdminUserspaceRegister register) throws UnsupportedEncodingException {
  206. // 1、拼装数据
  207. Userspace userspace = new Userspace();
  208. userspace.setSpaceName(register.getSpaceName());
  209. userspace.setBusinessCode(register.getBusinessCode());
  210. // 查询用户信息
  211. User user = Optional.ofNullable(register.getUserUU())
  212. .map(userUU -> userService.findOne(userUU))
  213. .orElse(null);
  214. if (user == null) {
  215. LOGGER.warn("通过登录管理员注册企业警告,用户uu号未注册,参数:{}", JSON.toJSONString(register));
  216. return error("用户uu号未注册");
  217. }
  218. ///2、注册
  219. request.getSession().setAttribute("mobile", user.getMobile());
  220. ModelMap data = this.register(userspace, user, register.getAppId(), register.getBaseUrl(), register.getT(), register.getReturnUrl(), true);
  221. return data;
  222. }
  223. /**
  224. * 获取验证码
  225. *
  226. * @param mobile 手机号
  227. * @param mobileArea
  228. * @param timestamp 时间戳
  229. * @param code 图片验证码
  230. * @param sign 签名,签名不通过也返回正确
  231. * @return success(tokenId)
  232. */
  233. @RequestMapping(value = "/checkCode", method = RequestMethod.GET)
  234. @ResponseBody
  235. public ModelMap getCode(String mobile, String mobileArea, String timestamp, String code, String sign) {
  236. if (StringUtils.isEmpty(timestamp)){
  237. return error("恶意访问");
  238. }
  239. // 校验图片验证码
  240. Token captchaToken = tokenService.findOne(request.getSession().getId());
  241. if (captchaToken == null) {
  242. return error("图片验证码过期");
  243. }
  244. if (code != null && !code.equalsIgnoreCase((String) captchaToken.getBind())) {
  245. return error("请输入正确的验证码");
  246. }
  247. tokenService.delete(request.getSession().getId());
  248. // 校验发送短信频率,60秒一次,key为#{sessionId}_#{类名}
  249. String key = request.getSession().getId() + "_" + this.getClass().getSimpleName();
  250. Token rateToken = tokenService.findOne(key);
  251. if (rateToken != null) {
  252. return error("验证码发送间隔过快");
  253. }
  254. // 校验手机号
  255. checkMobile(mobile, mobileArea);
  256. // 获取验证码,根据签名判断是否需要获取验证码
  257. String str = "{mobile=" + mobile + ",code=" + code + ",salt=sso}";
  258. String existSign = Md5Utils.encode(str, null);
  259. String token;
  260. if (existSign.equals(sign)) {
  261. token = getMobileToken(mobile);
  262. } else {
  263. token = StringUtil.uuid();
  264. LOGGER.warn("签名不通过!加密参数:{},sign:{}", str, sign);
  265. }
  266. // 设置发送短信频率
  267. rateToken = new Token(key, "", 60);
  268. tokenService.save(rateToken);
  269. // 设置返回数据
  270. ModelMap data = new ModelMap();
  271. data.put("token", token);
  272. data.put("code", request.getSession().getAttribute("code"));
  273. request.getSession().setAttribute("token", token);
  274. return data;
  275. }
  276. /**
  277. * 校验验证码
  278. *
  279. * @param code 验证码
  280. * @param token 验证码tokenId
  281. * @return 验证成功:success()
  282. */
  283. @RequestMapping(value = "/checkCode", method = RequestMethod.POST)
  284. @ResponseBody
  285. public ModelMap checkCode(String token, String mobile, String code) {
  286. // 校验token是否正确
  287. String sessionToken = (String) request.getSession().getAttribute("token");
  288. if (StringUtils.isEmpty(sessionToken) || !sessionToken.equals(token)) {
  289. return error("请重新获取验证码");
  290. }
  291. // 校验验证码
  292. checkMobileCode(token, mobile, code);
  293. // 设置返回值
  294. return success();
  295. }
  296. }