LoginController.java 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. package com.uas.sso.controller;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.uas.sso.SSOConfig;
  5. import com.uas.sso.SSOHelper;
  6. import com.uas.sso.SSOToken;
  7. import com.uas.sso.common.util.HttpUtil;
  8. import com.uas.sso.core.Const;
  9. import com.uas.sso.entity.App;
  10. import com.uas.sso.entity.UserAccount;
  11. import com.uas.sso.service.AppService;
  12. import com.uas.sso.service.UserService;
  13. import com.uas.sso.service.impl.UserAccountService;
  14. import com.uas.sso.util.AccountTypeUtils;
  15. import com.uas.sso.web.waf.request.WafRequestWrapper;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.ui.ModelMap;
  18. import org.springframework.util.CollectionUtils;
  19. import org.springframework.util.StringUtils;
  20. import org.springframework.web.bind.annotation.RequestMapping;
  21. import org.springframework.web.bind.annotation.RequestMethod;
  22. import org.springframework.web.bind.annotation.ResponseBody;
  23. import org.springframework.web.bind.annotation.RestController;
  24. import java.util.*;
  25. /**
  26. * 登录controller
  27. *
  28. * @author wangmh
  29. * @date 2018/1/5
  30. */
  31. @RequestMapping("/sso/login")
  32. @RestController
  33. public class LoginController extends BaseController {
  34. @Autowired
  35. private AppService appService;
  36. @Autowired
  37. private UserService userService;
  38. @Autowired
  39. private UserAccountService userAccountService;
  40. @RequestMapping(method = RequestMethod.POST)
  41. @ResponseBody
  42. public ModelMap login() {
  43. // 获取登录信息
  44. WafRequestWrapper wr = new WafRequestWrapper(request);
  45. String appId = wr.getParameter("appId");
  46. String spaceUU = wr.getParameter("spaceUU");
  47. String username = StringUtils.trimAllWhitespace(wr.getParameter("username"));
  48. String password = wr.getParameter("password");
  49. String returnUrl = wr.getParameter("returnUrl");
  50. String baseUrl = wr.getParameter("baseUrl");
  51. // 校验空参数
  52. if (StringUtils.isEmpty(username)) {
  53. return error("用户名不能为空");
  54. }
  55. if (StringUtils.isEmpty(password)) {
  56. return error("密码不能为空");
  57. }
  58. // 设置baseUrl
  59. if (!StringUtils.isEmpty(baseUrl)) {
  60. request.getSession().setAttribute("baseUrl", baseUrl);
  61. }
  62. // 校验appId,appId为空的话默认为sso
  63. appId = StringUtils.isEmpty(appId) ? "sso" : appId;
  64. App app = appService.findOne(appId);
  65. if (app == null) {
  66. return error("应用id不存在");
  67. }
  68. // 登录
  69. App controlApp = StringUtils.isEmpty(app.getUserControl()) ? app : appService.findOne(app.getUserControl());
  70. boolean personalEnable = Const.YES == controlApp.getPersonalEnable();
  71. if (StringUtils.isEmpty(spaceUU)) {
  72. /*企业uu号为空,让用户选择企业*/
  73. // 找到用户账号信息
  74. List<UserAccount> userAccounts = getUserAccountByUserName(controlApp.getUid(), username);
  75. // 应用不允许个人账号,并且账号未绑定企业
  76. if (!personalEnable && CollectionUtils.isEmpty(userAccounts)) {
  77. return error("用户名或密码错误");
  78. }
  79. // 应用允许个人账号,并且账号未绑定企业,或者只绑定了一个企业,直接登录
  80. if (userAccounts.size() == 1) {
  81. return loginByUser(userAccounts.get(0), password, returnUrl);
  82. }
  83. // 由于老账户存在多个账号绑定一个邮箱的情况,把密码不符合的企业去除
  84. Iterator<UserAccount> iterator = userAccounts.iterator();
  85. while (iterator.hasNext()) {
  86. UserAccount userAccount = iterator.next();
  87. String encryPwd = userService.getEncryPassword(Const.ENCRY_FORMAT, password, userAccount.getSalt());
  88. if (!encryPwd.equals(userAccount.getPassword())) {
  89. iterator.remove();
  90. }
  91. }
  92. // 返回企业id和名称
  93. return success(getSpaceSelect(userAccounts, personalEnable));
  94. } else if (spaceUU.equals(Const.SPACEUU_PERSONAL)) {
  95. // 使用个人账号登录
  96. UserAccount userAccount = getUserAccountByUserName(controlApp.getUid(), username, null);
  97. return loginByUser(userAccount, password, returnUrl);
  98. } else {
  99. // 带企业登录
  100. UserAccount userAccount = getUserAccountByUserName(controlApp.getUid(), username, spaceUU);
  101. return loginByUser(userAccount, password, returnUrl);
  102. }
  103. }
  104. private List<UserAccount> getUserAccountByUserName(String appId, String username) {
  105. String type = AccountTypeUtils.getAccountType(username);
  106. if (AccountTypeUtils.MOBILE.equals(type)) {
  107. // 手机号登录
  108. return userAccountService.findByMobile(appId, username);
  109. }
  110. if (AccountTypeUtils.EMAIL.equals(type)) {
  111. // 邮箱登录
  112. return userAccountService.findByEmail(appId, username);
  113. }
  114. if (AccountTypeUtils.UU_NUMBER.equals(type)) {
  115. // uu号登录
  116. return userAccountService.findOneByUserUU(appId, Long.valueOf(username));
  117. }
  118. // 其余情况
  119. return null;
  120. }
  121. private UserAccount getUserAccountByUserName(String appId, String username, String spaceUU) {
  122. String type = AccountTypeUtils.getAccountType(username);
  123. if (AccountTypeUtils.MOBILE.equals(type)) {
  124. // 手机号登录
  125. return userAccountService.findOneByMobile(appId, username, spaceUU);
  126. }
  127. if (AccountTypeUtils.EMAIL.equals(type)) {
  128. // 邮箱登录
  129. return userAccountService.findOneByEmail(appId, username, spaceUU);
  130. }
  131. if (AccountTypeUtils.UU_NUMBER.equals(type)) {
  132. // uu号登录
  133. return userAccountService.findOneByUserUU(appId, Long.valueOf(username), spaceUU);
  134. }
  135. // 其余情况
  136. return null;
  137. }
  138. private ModelMap loginByUser(UserAccount userAccount, String password, String returnUrl) {
  139. if (StringUtils.isEmpty((userAccount.getPassword()))) {
  140. // 使用错误码100来判断
  141. return error("100", "未设置密码");
  142. } else {
  143. // 校验密码
  144. String encryPwd = userService.getEncryPassword(Const.ENCRY_FORMAT, password, userAccount.getSalt());
  145. if (!encryPwd.equals(userAccount.getPassword())) {
  146. return error("您输入的账号或密码有误");
  147. }
  148. // 登录
  149. /*
  150. * 设置登录 Cookie 最后一个参数 true 时添加 cookie 同时销毁当前 JSESSIONID
  151. * 创建信任的 JSESSIONID
  152. */
  153. SSOToken st = new SSOToken(request, userAccount.getMobile());
  154. st.setData(JSON.toJSONString(userAccount));
  155. SSOHelper.setSSOCookie(request, response, st, true);
  156. // 通知各个应用用户已经登录
  157. ModelMap data = new ModelMap();
  158. data = addOtherAppRequestData(userAccount, data, request.getSession().getAttribute("baseUrl"), true);
  159. data.put("returnUrl", HttpUtil.decodeURL(returnUrl));
  160. return success(data);
  161. }
  162. }
  163. private ModelMap addOtherAppRequestData(UserAccount userAccount, ModelMap data, Object loginUrl,
  164. boolean isLoginAll) {
  165. // 需要通知的应用数量
  166. int count = 0;
  167. List<App> apps = appService.findAll();
  168. List<String> loginUrls = new ArrayList<>();
  169. boolean hasLoginUrl = false;
  170. if (isLoginAll) {
  171. for (App app : apps) {
  172. if (StringUtils.isEmpty(app.getLoginUrl())) {
  173. continue;
  174. }
  175. if (app.getLoginUrl().equals(loginUrl)) {
  176. hasLoginUrl = true;
  177. }
  178. loginUrls.add(app.getLoginUrl());
  179. count++;
  180. }
  181. }
  182. // 添加baseUrl
  183. if (!hasLoginUrl && !StringUtils.isEmpty(loginUrl)) {
  184. loginUrls.add(loginUrl.toString());
  185. count++;
  186. }
  187. data.put("count", count);
  188. data.put("loginUrls", loginUrls);
  189. // 添加传递数据
  190. JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(userAccount));
  191. Integer maxage = (Integer) request.getAttribute(SSOConfig.SSO_COOKIE_MAXAGE);
  192. jsonObject.put("maxage", maxage);
  193. data.put("data", jsonObject);
  194. return data;
  195. }
  196. /**
  197. * 获取选择企业信息(id:企业uu号,name:名称)
  198. *
  199. * @param userAccounts 用户账户信息
  200. * @param personalEnable 该应用是否允许个人账户
  201. * @return
  202. */
  203. private ModelMap getSpaceSelect(List<UserAccount> userAccounts, boolean personalEnable) {
  204. List<Map<String, Object>> spaces = new ArrayList<Map<String, Object>>();
  205. Map<String, Object> space = null;
  206. // 设置带企业账号
  207. for (UserAccount userAccount : userAccounts) {
  208. space = new HashMap<String, Object>(2);
  209. space.put("id", userAccount.getSpaceUU());
  210. space.put("name", userAccount.getSpaceName());
  211. }
  212. // 设置个人账号
  213. if (personalEnable) {
  214. space = new HashMap<String, Object>(2);
  215. space.put("id", Const.SPACEUU_PERSONAL);
  216. space.put("name", String.format("%s(个人)", userAccounts.get(0).getVipName()));
  217. }
  218. return new ModelMap("spaces", spaces);
  219. }
  220. }