SecurityController.java 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. package com.uas.console.donate.controller;
  2. import com.uas.console.donate.core.support.SystemSession;
  3. import com.uas.console.donate.model.UsageBufferedLogger;
  4. import com.uas.console.donate.model.User;
  5. import com.uas.console.donate.service.UserService;
  6. import com.uas.console.donate.util.FastjsonUtils;
  7. import com.uas.console.donate.web.CommonController;
  8. import com.uas.platform.core.logging.BufferedLoggerManager;
  9. import com.uas.sso.AuthToken;
  10. import com.uas.sso.SSOConfig;
  11. import com.uas.sso.SSOHelper;
  12. import com.uas.sso.SSOToken;
  13. import com.uas.sso.entity.UserAccount;
  14. import org.springframework.beans.factory.annotation.Autowired;
  15. import org.springframework.http.HttpStatus;
  16. import org.springframework.ui.ModelMap;
  17. import org.springframework.util.StringUtils;
  18. import org.springframework.web.bind.annotation.*;
  19. import javax.servlet.http.HttpServletRequest;
  20. import javax.servlet.http.HttpServletResponse;
  21. import javax.servlet.http.HttpSession;
  22. import java.io.IOException;
  23. /**
  24. * 账号登录配置
  25. *
  26. * Created by hejq on 2017-11-15.
  27. */
  28. @RequestMapping(value = "/sso")
  29. @RestController
  30. public class SecurityController extends CommonController {
  31. @Autowired
  32. private UserService userService;
  33. private final static UsageBufferedLogger logger = BufferedLoggerManager.getLogger(UsageBufferedLogger.class);
  34. /**
  35. * 账户信息、SSO配置
  36. *
  37. * @return
  38. */
  39. @RequestMapping(value = "/account", method = RequestMethod.GET)
  40. public ModelMap getAccountInfo() {
  41. return success(SystemSession.getUser());
  42. }
  43. /**
  44. * 跳转登录
  45. *
  46. * @throws IOException
  47. */
  48. @RequestMapping(value = "/login", method = RequestMethod.GET)
  49. public ModelMap getLoginPage() throws IOException {
  50. SSOHelper.clearLogin(request, response);
  51. String url= SSOHelper.getRedirectRefererLoginUrl(request);
  52. boolean cross = SSOHelper.isCrossDomain(request);
  53. if (cross) {
  54. // 跨域代理界面
  55. url = "login/proxy";
  56. }
  57. return success(url);
  58. }
  59. /**
  60. * 退出
  61. *
  62. * @throws IOException
  63. */
  64. @RequestMapping(value = "/logout", method = RequestMethod.GET, headers = "Accept=application/json")
  65. @ResponseStatus(value= HttpStatus.OK)
  66. public ModelMap logout(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
  67. session.invalidate();
  68. SSOHelper.clearLogin(request, response);
  69. SystemSession.clear();
  70. String returnUrl = request.getHeader("Referer");
  71. boolean cross = SSOHelper.isCrossDomain(request);
  72. if (cross) {
  73. request.getSession().setAttribute(SSOConfig.SSOReferer, returnUrl);
  74. // 跨域情况,需要再次询问账户中心
  75. returnUrl = "logout/proxy";
  76. }
  77. return new ModelMap("content", returnUrl);
  78. }
  79. /**
  80. * 获取跳转登录的url
  81. *
  82. * @param request
  83. * @param response
  84. * @return
  85. * @throws IOException
  86. */
  87. @RequestMapping(value = "/login/page")
  88. @ResponseBody
  89. public ModelMap signin(HttpServletRequest request, HttpServletResponse response) throws IOException {
  90. request.getSession().setAttribute(SSOConfig.SSOReferer, request.getHeader("Referer"));
  91. SSOHelper.clearLogin(request, response);
  92. String redirectUrl = SSOHelper.getRedirectRefererLoginUrl(request);
  93. boolean cross = SSOHelper.isCrossDomain(request);
  94. if (cross) {
  95. // 跨域代理界面
  96. redirectUrl = "login/proxy";
  97. }
  98. return new ModelMap("content", redirectUrl);
  99. }
  100. /**
  101. * 获取跨域登录的参数
  102. *
  103. * @param request
  104. * @param response
  105. * @return
  106. * @throws IOException
  107. */
  108. @RequestMapping(value = "/login/crossBefore")
  109. public ModelMap getCrossLoginData(HttpServletRequest request, HttpServletResponse response) throws IOException {
  110. ModelMap model = new ModelMap();
  111. SSOConfig config = SSOHelper.getSSOService().getConfig();
  112. // 业务系统私钥签名 authToken 自动设置临时会话 cookie 授权后自动销毁
  113. AuthToken at = SSOHelper.askCiphertext(request, response, config.getClientPrivateKey());
  114. // askUrl 询问 sso 是否登录地址
  115. model.addAttribute("askUrl", config.getCrossAskUrl());
  116. // askTxt 询问 token 密文
  117. model.addAttribute("askData", at.encryptAuthToken());
  118. // 未登录情况下,登录地址
  119. Object loginUrl = null;
  120. boolean cross = SSOHelper.isCrossDomain(request);
  121. if (cross) {
  122. loginUrl = SSOHelper.getRedirectRefererLoginUrl(request);
  123. } else {
  124. loginUrl = SSOHelper.getRedirectLoginUrl(request, String.valueOf(request.getSession().getAttribute("SSOReferer")));
  125. }
  126. model.addAttribute("loginUrl", loginUrl);
  127. return model;
  128. }
  129. /**
  130. * 跨域登录后
  131. *
  132. * @param request
  133. * @param response
  134. */
  135. @RequestMapping(value = "/login/crossAfter")
  136. public ModelMap afterCrossLogin(HttpServletRequest request, HttpServletResponse response, String replyTxt) {
  137. if (!StringUtils.isEmpty(replyTxt)) {
  138. Object returnUrl = request.getSession().getAttribute(SSOConfig.SSOReferer);
  139. SSOConfig config = SSOHelper.getSSOService().getConfig();
  140. AuthToken token = SSOHelper.ok(request, response, replyTxt, config.getClientPublicKey(), config.getCenterPublicKey());
  141. if (token != null) {
  142. SSOToken tk = new SSOToken();
  143. tk.setUid(token.getUid());
  144. tk.setTime(token.getTime());
  145. tk.setData(token.getData());
  146. SSOHelper.setSSOCookie(request, response, tk, true);
  147. UserAccount user = getUserByToken(tk);
  148. if (user != null) {
  149. request.getSession().setAttribute("user", user);
  150. User u = userService.findOne(user.getUserUU());
  151. SystemSession.setUser(u);
  152. }
  153. // returnUrl有时候为null,然后生成URL的时候会出现undefined
  154. return new ModelMap("returnUrl", returnUrl==null?"":returnUrl);
  155. }
  156. }
  157. return null;
  158. }
  159. private UserAccount getUserByToken(SSOToken token) {
  160. UserAccount authedUser = null;
  161. if (token.getData() != null) {
  162. authedUser = FastjsonUtils.fromJson(token.getData(), UserAccount.class);
  163. }
  164. return authedUser;
  165. }
  166. /**
  167. * 获取跨域登录的参数
  168. *
  169. * @param request
  170. * @param response
  171. * @return
  172. * @throws IOException
  173. */
  174. @RequestMapping(value = "/logout/crossBefore")
  175. public ModelMap getCrossLogoutData(HttpServletRequest request, HttpServletResponse response) throws IOException {
  176. ModelMap model = new ModelMap();
  177. SSOConfig config = SSOHelper.getSSOService().getConfig();
  178. model.addAttribute("askUrl", config.getCrossAskOutUrl());
  179. model.addAttribute("returnUrl", String.valueOf(request.getSession().getAttribute(SSOConfig.SSOReferer)));
  180. // 登录情况下,登出地址
  181. Object logoutUrl = null;
  182. boolean cross = SSOHelper.isCrossDomain(request);
  183. if (cross) {
  184. logoutUrl = SSOHelper.getRedirectRefererLogoutUrl(request);
  185. } else {
  186. logoutUrl = SSOHelper.getRedirectLogoutUrl(request, String.valueOf(request.getSession().getAttribute("SSOReferer")));
  187. }
  188. model.addAttribute("logoutUrl", logoutUrl);
  189. return model;
  190. }
  191. }