TokenController.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. package com.zd.auth.controller;
  2. import cn.hutool.core.util.RandomUtil;
  3. import com.zd.auth.form.LoginBody;
  4. import com.zd.auth.form.RegisterBody;
  5. import com.zd.auth.service.SysLoginService;
  6. import com.zd.chemical.api.fegin.RemoteStockService;
  7. import com.zd.common.core.exception.ServiceException;
  8. import com.zd.common.core.redis.RedisService;
  9. import com.zd.common.core.security.TokenService;
  10. import com.zd.common.core.utils.DESUtils;
  11. import com.zd.common.core.utils.IdUtils;
  12. import com.zd.common.core.utils.StringUtils;
  13. import com.zd.model.constant.*;
  14. import com.zd.model.domain.AjaxResult;
  15. import com.zd.model.domain.R;
  16. import com.zd.model.entity.LoginUser;
  17. import com.zd.model.entity.SysUser;
  18. import com.zd.system.api.feign.RemoteUserService;
  19. import org.slf4j.Logger;
  20. import org.slf4j.LoggerFactory;
  21. import org.springframework.beans.BeanUtils;
  22. import org.springframework.beans.factory.annotation.Autowired;
  23. import org.springframework.data.redis.core.RedisTemplate;
  24. import org.springframework.web.bind.annotation.DeleteMapping;
  25. import org.springframework.web.bind.annotation.PostMapping;
  26. import org.springframework.web.bind.annotation.RequestBody;
  27. import org.springframework.web.bind.annotation.RestController;
  28. import javax.annotation.Resource;
  29. import javax.servlet.http.HttpServletRequest;
  30. import java.util.List;
  31. import java.util.Map;
  32. import java.util.Objects;
  33. import java.util.concurrent.TimeUnit;
  34. import static com.zd.model.constant.BaseConstants.CODE_EXPIRATION;
  35. /**
  36. * token 控制
  37. *
  38. * @author zd
  39. */
  40. @RestController
  41. public class TokenController {
  42. private final Logger logger = LoggerFactory.getLogger(TokenController.class);
  43. @Autowired
  44. private TokenService tokenService;
  45. @Autowired
  46. private SysLoginService sysLoginService;
  47. @Autowired
  48. private RemoteUserService remoteUserService;
  49. @Autowired
  50. private RedisService redisService;
  51. @Autowired
  52. private RemoteStockService stockService;
  53. @Resource
  54. private RedisTemplate<String, String> redisTemplate;
  55. @PostMapping("login")
  56. public R<?> login(@RequestBody LoginBody form) {
  57. // 用户登录
  58. String authType = form.getAuthType() == null ? BaseConstants.GRANT_TYPE_PASSWORD : form.getAuthType();
  59. LoginUser userInfo;
  60. if (Objects.equals(authType, BaseConstants.GRANT_TYPE_MOBILE)) {
  61. String key = BaseConstants.DEFAULT_CODE_KEY + BaseConstants.GRANT_TYPE_MOBILE + "@" + form.getUsername();
  62. String code = redisTemplate.opsForValue().get(key);
  63. if (form.getPassword().equals(code)) {
  64. R<LoginUser> userR = remoteUserService.getUserInfo(form.getUsername(), SecurityConstants.INNER);
  65. if (userR.getCode() == HttpStatus.SUCCESS && userR.getData() != null) {
  66. userInfo = userR.getData();
  67. } else {
  68. throw new ServiceException("服务未知异常,请稍后重试");
  69. }
  70. } else {
  71. throw new ServiceException("验证码不正确", 503);
  72. }
  73. } else {
  74. userInfo = sysLoginService.login(form.getUsername(), UserConstants.USER_LOGIN_PC, form.getPassword());
  75. }
  76. userInfo.setLoginType(UserConstants.USER_LOGIN_PC);
  77. Map<String, Object> data = tokenService.createToken(userInfo);
  78. //这里判断输入的密码,是否和默认配置密码一样,如果一样,需要提示跳转设置密码
  79. AjaxResult resultPassword = remoteUserService.getConfigKey("sys.user.initPassword");
  80. if ((resultPassword.get("code") + "").equals("200")) {
  81. String defaultPassword = (String) resultPassword.get("msg");
  82. if (defaultPassword != null && defaultPassword.equals(form.getPassword())) {
  83. data.put("reset_password", true);
  84. } else {
  85. data.put("reset_password", false);
  86. }
  87. }
  88. // 区分大屏用户
  89. // 查询大屏链接
  90. AjaxResult result = remoteUserService.getRouters(userInfo.getUserid());
  91. try {
  92. List<Map<String, Object>> routers = (List<Map<String, Object>>) result.get("data");
  93. Map<String, Object> dataMenu = routers.stream().filter(
  94. a -> "https://www.sxitdlc.com".equals(a.get("path") + "")).findFirst().orElse(null);
  95. if (dataMenu != null) {
  96. String tokenKey = "login_screen:";
  97. Integer type;
  98. if (userInfo.getSysUser().isAdmin()) {
  99. type = 1;
  100. } else {
  101. result = remoteUserService.selectAuthUserPower(userInfo.getUserid());
  102. Map<String, Object> map = (Map<String, Object>) result.get("data");
  103. type = Integer.parseInt(map.get("type") + "");
  104. }
  105. if (type == null) {
  106. // 没有大屏权限
  107. type = 3;
  108. data.put("screen_token", "");
  109. } else if (redisService.hasKey(tokenKey + userInfo.getUserid())) {
  110. String token = redisService.getCacheObject(tokenKey + userInfo.getUserid());
  111. commLogin(userInfo, token);
  112. data.put("screen_token", token);
  113. } else {
  114. String token = IdUtils.fastUUID();
  115. commLogin(userInfo, token);
  116. redisService.setCacheObject(tokenKey + userInfo.getUserid(), token);
  117. // 获取大屏TOKEN
  118. data.put("screen_token", token);
  119. }
  120. data.put("screen_type", type);
  121. } else {
  122. // 没有大屏权限
  123. data.put("screen_type", 3);
  124. data.put("screen_token", "");
  125. }
  126. } catch (Exception e) {
  127. // 没有大屏权限
  128. data.put("screen_type", 3);
  129. data.put("screen_token", "");
  130. }
  131. // 获取登录token
  132. return R.ok(data);
  133. }
  134. //公共登录方法
  135. private void commLogin(LoginUser userInfo, String token) {
  136. LoginUser loginUser = new LoginUser();
  137. BeanUtils.copyProperties(userInfo, loginUser);
  138. loginUser.setToken(token);
  139. redisService.setCacheObject(CacheConstants.LOGIN_TOKEN_KEY + token, loginUser);
  140. }
  141. /**
  142. * 一体机登录
  143. * 小程序登录也在用
  144. */
  145. @PostMapping("/one/login")
  146. public R<?> oneLogin(@RequestBody LoginBody form) {
  147. // 用户登录
  148. LoginUser userInfo = sysLoginService.login(form.getUsername(), UserConstants.USER_LOGIN_WX, form.getPassword());
  149. userInfo.setLoginType(UserConstants.USER_LOGIN_WX);
  150. // 获取登录token
  151. return R.ok(tokenService.createProgramToken(userInfo));
  152. }
  153. /**
  154. * 发送验证码
  155. */
  156. @PostMapping("/send/code")
  157. public R<?> send(@RequestBody LoginBody form) {
  158. String username = form.getUsername();
  159. R<LoginUser> userR = remoteUserService.getUserInfo(username, SecurityConstants.INNER);
  160. if (userR.getCode() != HttpStatus.SUCCESS || userR.getData() == null) {
  161. throw new ServiceException("用户不存在", 530);
  162. }
  163. String key = BaseConstants.DEFAULT_CODE_KEY + BaseConstants.GRANT_TYPE_MOBILE + "@" + username;
  164. String code = RandomUtil.randomNumbers(6);
  165. redisTemplate.opsForValue().set(key, code, CODE_EXPIRATION, TimeUnit.MINUTES);
  166. logger.info("========================>{}<=========================", code);
  167. String countKey = BaseConstants.DEFAULT_CODE_KEY + "@" + username + "_COUNT";
  168. String count = redisTemplate.opsForValue().get(countKey);
  169. if (StringUtils.isEmpty(count)) {
  170. redisTemplate.opsForValue().set(countKey, "1", 60, TimeUnit.MINUTES);
  171. } else {
  172. if (count != null) {
  173. int i = Integer.parseInt(count);
  174. if (i >= 5) {
  175. throw new ServiceException("验证码发送超过限制,请一小时后再试", 530);
  176. }
  177. i++;
  178. redisTemplate.opsForValue().set(countKey, i + "", 60, TimeUnit.MINUTES);
  179. }
  180. }
  181. return stockService.sendSydSms(code, 2, null, form.getUsername());
  182. }
  183. /**
  184. * 学习一体机 用户端登录
  185. * 接口修改为分两步操作,1 刷卡获取人员信息和token , 2 人脸验证之后再调用一次实现真实登录
  186. * type : 1 和 2
  187. */
  188. @PostMapping("/learn/login")
  189. public R<?> learnLogin(HttpServletRequest request, @RequestBody Map<String, Object> params) {
  190. int type = org.apache.commons.lang3.StringUtils.isNotBlank((String) params.get("type")) ? Integer.parseInt((String) params.get("type")) : 1;
  191. String machineCode = params.get("machineCode") == null ? "" : (String) params.get("machineCode");
  192. // 用户登录
  193. String username = (String) params.get("userName");
  194. int aioType = params.get("aioType") == null ? UserConstants.USER_LOGIN_AIO : Integer.parseInt(params.get("aioType") + "");
  195. logger.error("学习机登录,加密前:" + username + ",设备编码:" + machineCode);
  196. if (UserConstants.USER_LOGIN_HXP == aioType) {
  197. // TODO 终端传参数据有问题,暂临时后端处理
  198. //通过des生成对称加密卡号
  199. logger.error("化学品登录,加密前:" + username);
  200. username =DESUtils.encrypt(username+"");
  201. logger.error("化学品登录,加密后:" + username);
  202. // username = username.replaceAll("%00", "")
  203. // .replaceAll("%02", "")
  204. // .replaceAll("%03", "")
  205. // .replaceAll("%0A", "")
  206. // .replaceAll("%0D", "")
  207. // .trim();
  208. } else {
  209. // 查询用户信息
  210. // if (StringUtils.isNumeric(username)) {
  211. // username = Long.toHexString(Long.parseLong(username)).toUpperCase();
  212. username =DESUtils.encrypt(username+"");
  213. logger.error("学习机登录,加密后:" + username);
  214. // } else {
  215. // logger.error("通过卡号未找到用户");
  216. // return R.fail("无效卡号或未绑定用户,请联系管理员!");
  217. // }
  218. }
  219. R<SysUser> user = remoteUserService.getUserInfoByCardNum(username, SecurityConstants.INNER);
  220. if (R.FAIL == user.getCode()) {
  221. throw new ServiceException(user.getMsg());
  222. }
  223. if (StringUtils.isNull(user.getData())) {
  224. return R.fail("账号信息不存在");
  225. }
  226. R<LoginUser> userResult = remoteUserService.getUserInfo(user.getData().getUserName(), aioType, SecurityConstants.INNER);
  227. if (R.FAIL == userResult.getCode() || 503 == userResult.getCode()) {
  228. return R.fail(userResult.getMsg());
  229. }
  230. if (userResult.getData() != null) {
  231. LoginUser userInfo = userResult.getData();
  232. userInfo.setLoginType(aioType);
  233. userInfo.setMachineCode(machineCode);
  234. if (userInfo.getSysUser() == null) {
  235. return R.fail("账号信息不存在");
  236. }
  237. Map<String, Object> map = null;
  238. if (type == 1) {
  239. // 获取登录token
  240. map = tokenService.createToken(userInfo);
  241. } else if (type == 2) {
  242. // 资源删除
  243. LoginUser loginUser = tokenService.getLoginUser(request);
  244. if (StringUtils.isNotNull(loginUser)) {
  245. // 删除用户缓存记录
  246. tokenService.delLoginUser(loginUser.getToken());
  247. }
  248. map = tokenService.createToken(userInfo);
  249. if (UserConstants.USER_LOGIN_HXP == aioType) {
  250. map.put("positionName", userInfo.getSysUser().getPositionName());
  251. map.put("cabinetLock", userInfo.isCabinetLock());
  252. map.put("airBottle", userInfo.isAirBottle());
  253. } else if (UserConstants.USER_LOGIN_AIO == aioType) {
  254. if (redisService.hasKey(CacheConstants.LEARN_USER_KEY + userInfo.getSysUser().getUserId())) {
  255. LoginUser userCache = redisService.getCacheObject(CacheConstants.LEARN_USER_KEY + userInfo.getSysUser().getUserId());
  256. if (!machineCode.equals(userCache.getMachineCode())) {
  257. return R.fail("签到失败,不能重复签到!");
  258. }
  259. }
  260. // 记录学习一体机用户登录状态
  261. redisService.setCacheObject(CacheConstants.LEARN_USER_KEY + userInfo.getSysUser().getUserId(), userInfo, BaseConstants.TOKEN_EXPIRE * 60, TimeUnit.SECONDS);
  262. }
  263. }
  264. return R.ok(map);
  265. } else {
  266. return R.fail("账号信息不存在");
  267. }
  268. }
  269. /**
  270. * 学习一体机 用户退出登录
  271. */
  272. @PostMapping("/learn/loginOut")
  273. public R<?> learnLoginOut(HttpServletRequest request) {
  274. LoginUser loginUser = tokenService.getLoginUser(request);
  275. if (StringUtils.isNotNull(loginUser)) {
  276. SysUser user = loginUser.getSysUser();
  277. // 删除用户缓存记录
  278. tokenService.delLoginUser(loginUser.getToken());
  279. // 记录用户退出日志
  280. sysLoginService.logout(user);
  281. // 删除一体机登录状态
  282. redisService.deleteObject(CacheConstants.LEARN_USER_KEY + loginUser.getUserid());
  283. }
  284. return R.ok();
  285. }
  286. @DeleteMapping("logout")
  287. public R<?> logout(HttpServletRequest request) {
  288. LoginUser loginUser = tokenService.getLoginUser(request);
  289. if (StringUtils.isNotNull(loginUser)) {
  290. SysUser user = loginUser.getSysUser();
  291. // 删除用户缓存记录
  292. tokenService.delLoginUser(loginUser.getToken());
  293. // 记录用户退出日志
  294. sysLoginService.logout(user);
  295. }
  296. return R.ok();
  297. }
  298. @PostMapping("refresh")
  299. public R<?> refresh(HttpServletRequest request) {
  300. LoginUser loginUser = tokenService.getLoginUser(request);
  301. if (StringUtils.isNotNull(loginUser)) {
  302. // 刷新令牌有效期
  303. tokenService.refreshToken(loginUser);
  304. return R.ok();
  305. }
  306. return R.ok();
  307. }
  308. @PostMapping("register")
  309. public R<?> register(@RequestBody RegisterBody registerBody) {
  310. // 用户注册
  311. sysLoginService.register(registerBody.getUsername(), registerBody.getPassword());
  312. return R.ok();
  313. }
  314. }