TokenAuthService.java 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. package cn.com.usky.iot.auth;
  2. import cn.com.usky.iot.controller.login.LoginService;
  3. import cn.com.usky.utils.DESUtils;
  4. import cn.com.usky.utils.ListUtil;
  5. import cn.com.usky.utils.MapUtils;
  6. import com.alibaba.fastjson.JSONException;
  7. import com.alibaba.fastjson.JSONObject;
  8. import org.apache.commons.codec.binary.Base64;
  9. import org.apache.commons.lang3.StringUtils;
  10. import org.apache.log4j.Logger;
  11. import org.joda.time.DateTime;
  12. import org.springframework.orm.hibernate3.HibernateTemplate;
  13. import javax.servlet.http.Cookie;
  14. import javax.servlet.http.HttpServletRequest;
  15. import java.util.Collections;
  16. import java.util.HashMap;
  17. import java.util.List;
  18. import java.util.Map;
  19. public final class TokenAuthService {
  20. private LoginService loginService;
  21. public LoginService getLoginService() {
  22. return loginService;
  23. }
  24. public void setLoginService(LoginService loginService) {
  25. this.loginService = loginService;
  26. }
  27. private HibernateTemplate hibernateTemplate;
  28. public HibernateTemplate getHibernateTemplate() {
  29. return hibernateTemplate;
  30. }
  31. public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
  32. this.hibernateTemplate = hibernateTemplate;
  33. }
  34. private static Logger LOGGER = Logger.getLogger(TokenAuthService.class);
  35. /**
  36. * token 用户Id
  37. **/
  38. public static String TOKEN_USERID = "userId";
  39. /**
  40. * token有效期开始时间[登录时间]
  41. **/
  42. public static String TOKEN_LOGIN_TIME = "loginTime";
  43. /**
  44. * token有效期结束时间[截止时间]
  45. **/
  46. public static String TOKEN_END_TIME = "endTime";
  47. /**
  48. * token
  49. **/
  50. public static String TOKEN = "token";
  51. /**
  52. * @param token 认证字符
  53. * @return TokenAuthEnum 认证result枚举
  54. * @author laowo 验证Token
  55. **/
  56. public TokenAuthBO verifyToken(String token) {
  57. if (StringUtils.isBlank(token)) {
  58. LOGGER.warn("token认证开始[end], token is null~");
  59. return new TokenAuthBO(TokenAuthEnum.FAIL_ISNULL, Collections.emptyMap());
  60. }
  61. JSONObject tokenJson = null;
  62. try {
  63. String base64Token = new String(Base64.decodeBase64(token));
  64. String decrypt = DESUtils.decrypt(base64Token);
  65. tokenJson = JSONObject.parseObject(decrypt);
  66. if (MapUtils.isBlank(tokenJson) || tokenJson.isEmpty()) {
  67. throw new SecurityException("tokenJson is NULL");
  68. }
  69. tokenJson.put(TOKEN, token);
  70. } catch (SecurityException | JSONException ex) {
  71. LOGGER.error("token 解析解密异常,message: " + ex.getMessage());
  72. return new TokenAuthBO(TokenAuthEnum.FAIL, Collections.emptyMap());
  73. }
  74. if (MapUtils.isEmptyMap(tokenJson,
  75. new String[]{TOKEN_USERID, TOKEN_LOGIN_TIME, TOKEN_END_TIME})) {
  76. LOGGER.warn("token缺失数据~");
  77. return new TokenAuthBO(TokenAuthEnum.FAIL_DATA_ERROR, tokenJson);
  78. }
  79. if (!StringUtils.isNumeric(tokenJson.getString(TOKEN_USERID))
  80. || !StringUtils.isNumeric(tokenJson.getString(TOKEN_LOGIN_TIME))
  81. || !StringUtils.isNumeric(tokenJson.getString(TOKEN_END_TIME))) {
  82. LOGGER.warn("token数据格式有误~");
  83. return new TokenAuthBO(TokenAuthEnum.FAIL_DATA_ERROR, tokenJson);
  84. }
  85. Integer loginTime = Integer.parseInt(tokenJson.getString(TOKEN_LOGIN_TIME));
  86. Integer endTime = Integer.parseInt(tokenJson.getString(TOKEN_END_TIME));
  87. // 判断token时间有效性
  88. long thisTime = System.currentTimeMillis() / 1000;
  89. if (!(thisTime >= loginTime && thisTime <= endTime)) {
  90. LOGGER.warn("token timeOut, token解析后的数据,tokenJson: " + tokenJson + ", thisTime: " + thisTime);
  91. return new TokenAuthBO(TokenAuthEnum.FAIL_TIMEOUT, tokenJson);
  92. }
  93. // 判断userId有效性
  94. String userId = tokenJson.getString(TOKEN_USERID);
  95. List userInfo = loginService.getObjectByUserId(userId);
  96. if (ListUtil.isBlank(userInfo)) {
  97. LOGGER.warn("认证失败,非有效用户~");
  98. return new TokenAuthBO(TokenAuthEnum.FAIL, tokenJson);
  99. }
  100. LOGGER.info("token认证成功 \n" + "token=" + token + "\n" + "tokenInfo=" + tokenJson);
  101. return new TokenAuthBO(TokenAuthEnum.SUCCESS, tokenJson);
  102. }
  103. /**
  104. * @param userId 用户Id, loginTime登录时间, changePwdTime密码修改时间
  105. * @return TokenAuthEnum 认证result枚举
  106. * @author laowo 创建Token
  107. **/
  108. public String createToken(String userId, Long loginTime) {
  109. LOGGER.info("创建Token[start], userId: " + userId + ", loginTime: " + loginTime + "");
  110. JSONObject tokenJson = new JSONObject();
  111. tokenJson.put(TOKEN_USERID, userId);
  112. tokenJson.put(TOKEN_LOGIN_TIME, loginTime);
  113. DateTime time = new DateTime(loginTime * 1000);
  114. time = time.plusMonths(1);
  115. long endTime = time.getMillis() / 1000;
  116. tokenJson.put(TOKEN_END_TIME, endTime);
  117. String encryptToken = DESUtils.encrypt(tokenJson.toJSONString());
  118. String token = Base64.encodeBase64URLSafeString(encryptToken.getBytes());
  119. LOGGER.info("创建Token[end], token: " + token);
  120. return token;
  121. }
  122. /**
  123. * 登录验证: code: 1,用户登录成功,获取用户userid;2,用户未登录;3,token失效
  124. *
  125. * @param request
  126. * @return
  127. * @author shaoxiaowen 2019/6/18
  128. */
  129. public Map<String, Object> loginChek(HttpServletRequest request) {
  130. LOGGER.info("登录验证");
  131. Map<String, Object> map = new HashMap<String, Object>();
  132. Cookie[] cookies = request.getCookies();
  133. if (cookies == null) {
  134. map.put("code", "2");
  135. return map;
  136. } else {
  137. for (Cookie cookie : cookies) {
  138. if (cookie.getName().equals("authToken")) {
  139. String loginInfo = cookie.getValue();
  140. TokenAuthBO tokenBo = verifyToken(loginInfo);
  141. if (!tokenBo.isAuthState()) {
  142. map.put("code", "3");
  143. return map;
  144. } else {
  145. String userId = tokenBo.getData().getString("userId");
  146. map.put("code", "1");
  147. map.put("userId", userId);
  148. return map;
  149. }
  150. }
  151. }
  152. return map;
  153. }
  154. }
  155. public static void main(String[] args) {
  156. String token = "TC1Yakh3TE45cWtyNXI0S3pXZW53Yms1RXQzSmVMQVFkTDQtek9lMGIxRG13NXVSZ1prRU1SallwOEF1NjRFMWVvV01qeUtJXzI1ZzFaeUFHVTg5bzNIaExZV093Q1o2ZmEzMko5Ulp4aFdpR1BYWm1Bdk4zUQ";
  157. String base64Token = new String(Base64.decodeBase64(token));
  158. String decrypt = DESUtils.decrypt(base64Token);
  159. System.out.println(decrypt);
  160. }
  161. }