TokenController.java 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. package com.xunmei.auth.controller;
  2. import cn.hutool.core.util.ObjectUtil;
  3. import com.xunmei.auth.form.LoginBody;
  4. import com.xunmei.auth.service.FJNXLoginService;
  5. import com.xunmei.auth.service.SysLoginService;
  6. import com.xunmei.common.core.constant.Constants;
  7. import com.xunmei.common.core.domain.R;
  8. import com.xunmei.common.core.utils.JwtUtils;
  9. import com.xunmei.common.core.utils.StringUtils;
  10. import com.xunmei.common.security.auth.AuthUtil;
  11. import com.xunmei.common.security.service.TokenService;
  12. import com.xunmei.common.security.utils.SecurityUtils;
  13. import com.xunmei.system.api.model.LoginUser;
  14. import org.slf4j.Logger;
  15. import org.slf4j.LoggerFactory;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.web.bind.annotation.*;
  18. import javax.annotation.Resource;
  19. import javax.servlet.http.HttpServletRequest;
  20. import javax.validation.constraints.NotEmpty;
  21. import javax.validation.constraints.NotNull;
  22. import java.util.Map;
  23. /**
  24. * token 控制
  25. *
  26. * @author xunmei
  27. */
  28. @RestController
  29. public class TokenController {
  30. @Resource
  31. private TokenService tokenService;
  32. @Autowired
  33. private SysLoginService loginService;
  34. @Autowired
  35. private FJNXLoginService fjnxLoginService;
  36. private static final Logger logger = LoggerFactory.getLogger("auth.token.login");
  37. @PostMapping("login")
  38. public R<?> login(@RequestBody LoginBody form) {
  39. try {
  40. if (!SecurityUtils.isApp()) {
  41. //登录重放问题处理,待前端完成放开
  42. //loginService.checkLogin(form.getAuthCode());
  43. }
  44. LoginUser userInfo = loginService.loginByPassword(form.getUsername(), form.getPassword(), Constants.LOGIN_TYPE_1);
  45. // 获取登录token
  46. return R.ok(tokenService.createToken(userInfo));
  47. } catch (Exception e) {
  48. return R.fail(e.getMessage());
  49. }
  50. // 用户登录
  51. }
  52. @PostMapping("loginApp")
  53. public R<?> loginApp(@RequestBody LoginBody form) {
  54. try {
  55. if (!SecurityUtils.isApp()) {
  56. //登录重放问题处理,待前端完成放开
  57. //loginService.checkLogin(form.getAuthCode());
  58. }
  59. LoginUser userInfo = loginService.loginByPassword(form.getUsername(), form.getPassword(), Constants.LOGIN_TYPE_0);
  60. // 获取登录token
  61. return R.ok(tokenService.createTokenNew(userInfo,form.getDeviceFrom()));
  62. } catch (Exception e) {
  63. return R.fail(e.getMessage());
  64. }
  65. // 用户登录
  66. }
  67. /**
  68. * 大屏登录
  69. * @param form
  70. * @return
  71. */
  72. @PostMapping("loginLargeScreen")
  73. public R<?> loginLargeScreen(@RequestBody LoginBody form) {
  74. try {
  75. if (!SecurityUtils.isApp()) {
  76. //登录重放问题处理,待前端完成放开
  77. //loginService.checkLogin(form.getAuthCode());
  78. }
  79. LoginUser userInfo = loginService.loginByPassword(form.getUsername(), form.getPassword(), Constants.LOGIN_TYPE_2);
  80. // 获取登录token
  81. return R.ok(tokenService.createToken(userInfo));
  82. } catch (Exception e) {
  83. return R.fail(e.getMessage());
  84. }
  85. // 用户登录
  86. }
  87. /**
  88. * APP 端切换用户
  89. * @param subUserId
  90. * @return
  91. */
  92. @GetMapping("switchUser")
  93. public R<?> switchUser(@RequestParam @NotEmpty Long subUserId,HttpServletRequest request) {
  94. try {
  95. if (!SecurityUtils.isApp()) {
  96. //登录重放问题处理,待前端完成放开
  97. //loginService.checkLogin(form.getAuthCode());
  98. }
  99. // 获取到切换后的用户信息
  100. LoginUser userInfo = loginService.switchUser(subUserId, Constants.LOGIN_TYPE_0);
  101. // 子账号切换回 主账号
  102. if(ObjectUtil.equal(SecurityUtils.getMasterUserId(),subUserId))
  103. {
  104. userInfo.setMasterUserId(null);
  105. userInfo.setMasterUserName(null);
  106. }
  107. else
  108. {
  109. // 设置切换后 主账号信息,如当是主账号 切换到子账号 再次切换到子账号 则设置当前登录账号已附带的 主账号信息
  110. if(ObjectUtil.isNotEmpty(SecurityUtils.getMasterUserId()) && ObjectUtil.isNotEmpty(SecurityUtils.getMasterUsername()))
  111. {
  112. userInfo.setMasterUserId(SecurityUtils.getMasterUserId());
  113. userInfo.setMasterUserName(SecurityUtils.getMasterUsername());
  114. }
  115. else
  116. {
  117. userInfo.setMasterUserId(SecurityUtils.getUserId());
  118. userInfo.setMasterUserName(SecurityUtils.getUsername());
  119. }
  120. }
  121. // 清除主用户的登录缓存数据
  122. String token = SecurityUtils.getToken(request);
  123. if (StringUtils.isNotEmpty(token)) {
  124. String username = JwtUtils.getUserName(token);
  125. // 删除用户缓存记录
  126. AuthUtil.logoutByToken(token);
  127. // 记录用户退出日志
  128. loginService.logout(username, Constants.LOGIN_TYPE_0);
  129. }
  130. // 获取登录token
  131. return R.ok(tokenService.createToken(userInfo));
  132. } catch (Exception e) {
  133. return R.fail(e.getMessage());
  134. }
  135. // 用户登录
  136. }
  137. /**
  138. * token登录方式
  139. * @param token token
  140. * @param loginType 登录类型 0 H5 1 web
  141. * @return
  142. */
  143. @GetMapping("tokenlogin")
  144. public R<?> tokenLogin(@RequestParam @NotEmpty String token, @RequestParam @NotNull String loginType) {
  145. try {
  146. logger.debug("token登录:1、请求进入。token:{}",token);
  147. String username = "";
  148. if(Constants.LOGIN_TYPE_0.equals(loginType)){
  149. username = fjnxLoginService.getUserByAppToken(token);
  150. }
  151. if(Constants.LOGIN_TYPE_1.equals(loginType)){
  152. username = fjnxLoginService.getUserByWebToken(token);
  153. }
  154. logger.debug("token登录:4、token验证且返回账号。token:{}",token);
  155. if(StringUtils.isNotEmpty(username)){
  156. LoginUser userInfo = loginService.loginToken(username, loginType);
  157. if(userInfo == null){
  158. return R.fail("无效的用户数据");
  159. }
  160. Map<String, Object> systemToken = tokenService.createToken(userInfo);
  161. logger.debug("token登录:5、生成系统自身Token完成,token:{}",token);
  162. return R.ok(systemToken);
  163. }else{
  164. return R.fail("无效的token");
  165. }
  166. } catch (Exception e) {
  167. return R.fail(e.getMessage());
  168. }
  169. // 用户登录
  170. }
  171. /**
  172. * 通过统一运营门户的账号密码登录到系统中
  173. * @param login
  174. * @return
  175. */
  176. @PostMapping("loginFjnx")
  177. public R<?> loginFjnx(@RequestBody LoginBody login){
  178. try{
  179. //登录统一运营
  180. String token = fjnxLoginService.webLoginByPass(login);
  181. if(StringUtils.isEmpty(token)){
  182. return R.fail("用户认证失败");
  183. }
  184. String username = fjnxLoginService.getUserByWebToken(token);
  185. if(StringUtils.isNotEmpty(username)){
  186. LoginUser userInfo = loginService.loginToken(username, Constants.LOGIN_TYPE_1);
  187. if(userInfo == null){
  188. return R.fail("无效的用户数据");
  189. }
  190. return R.ok(tokenService.createToken(userInfo));
  191. }else{
  192. return R.fail("无效的token");
  193. }
  194. }catch (Exception e){
  195. e.printStackTrace();
  196. return R.fail("登录失败");
  197. }
  198. }
  199. @DeleteMapping("logout")
  200. public R<?> logout(HttpServletRequest request) {
  201. String token = SecurityUtils.getToken(request);
  202. if (StringUtils.isNotEmpty(token)) {
  203. String username = JwtUtils.getUserName(token);
  204. // 删除用户缓存记录
  205. AuthUtil.logoutByToken(token);
  206. // 记录用户退出日志
  207. loginService.logout(username, Constants.LOGIN_TYPE_1);
  208. }
  209. return R.ok();
  210. }
  211. @DeleteMapping("logoutApp")
  212. public R<?> logoutApp(HttpServletRequest request) {
  213. String token = SecurityUtils.getToken(request);
  214. if (StringUtils.isNotEmpty(token)) {
  215. String username = JwtUtils.getUserName(token);
  216. // 删除用户缓存记录
  217. AuthUtil.logoutByToken(token);
  218. // 记录用户退出日志
  219. loginService.logout(username, Constants.LOGIN_TYPE_0);
  220. }
  221. return R.ok();
  222. }
  223. @PostMapping("refresh")
  224. public R<?> refresh(HttpServletRequest request) {
  225. LoginUser loginUser = tokenService.getLoginUser(request);
  226. if (StringUtils.isNotNull(loginUser)) {
  227. // 刷新令牌有效期
  228. tokenService.refreshToken(loginUser);
  229. return R.ok();
  230. }
  231. return R.ok();
  232. }
  233. }