SessionUtil.java 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package com.nosum.common.util;
  2. import com.auth0.jwt.JWT;
  3. import com.auth0.jwt.JWTVerifier;
  4. import com.auth0.jwt.algorithms.Algorithm;
  5. import com.auth0.jwt.exceptions.JWTDecodeException;
  6. import com.auth0.jwt.exceptions.JWTVerificationException;
  7. import com.nosum.common.base.domain.vo.UserSessionVO;
  8. import com.nosum.common.constant.Constants;
  9. import com.nosum.common.context.BeanTool;
  10. import com.nosum.common.enums.ErrorEnum;
  11. import com.nosum.deliver.auth.domain.po.AuthToken;
  12. import com.nosum.deliver.auth.domain.po.AuthUser;
  13. import org.apache.commons.lang3.StringUtils;
  14. import org.springframework.data.mongodb.core.MongoTemplate;
  15. import org.springframework.data.mongodb.core.query.Criteria;
  16. import org.springframework.data.mongodb.core.query.Query;
  17. import org.springframework.web.context.request.RequestContextHolder;
  18. import org.springframework.web.context.request.ServletRequestAttributes;
  19. import javax.servlet.http.HttpServletRequest;
  20. import java.time.LocalDateTime;
  21. import java.util.Objects;
  22. /**
  23. * 会话工具类.
  24. *
  25. * @author Young
  26. */
  27. public class SessionUtil {
  28. /**
  29. * 获取用户Session信息
  30. *
  31. * @return 用户 Session 信息
  32. */
  33. public static UserSessionVO getUserSessionInfo() {
  34. // 获取请求对象
  35. HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
  36. // 获取请求头Token值
  37. String token = request.getHeader(Constants.AUTHENTICATION);
  38. if (StringUtils.isBlank(token)) {
  39. return null;
  40. }
  41. // 获取 token 中的 user id
  42. AuthUser authUser = null;
  43. try {
  44. authUser = JsonUtil.parseObject(JWT.decode(token).getAudience().get(0), AuthUser.class);
  45. } catch (JWTDecodeException e) {
  46. ExceptionUtil.rollback(ErrorEnum.INVALID_TOKEN);
  47. }
  48. MongoTemplate mongoTemplate = BeanTool.getBean(MongoTemplate.class);
  49. AuthUser user = mongoTemplate.findById(authUser.getId(), AuthUser.class);
  50. if (user == null) {
  51. ExceptionUtil.rollback(ErrorEnum.LOGIN_ERROR);
  52. }
  53. // 验证 token
  54. JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(user.getPassword())).build();
  55. try {
  56. jwtVerifier.verify(token);
  57. } catch (JWTVerificationException e) {
  58. ExceptionUtil.rollback(ErrorEnum.INVALID_TOKEN);
  59. }
  60. long count = mongoTemplate.count(Query.query(Criteria.where("token").is(token).and("userId").is(user.getId()).and("expireTime").gte(LocalDateTime.now())), AuthToken.class);
  61. if (count == 0) {
  62. ExceptionUtil.rollback(ErrorEnum.INVALID_TOKEN);
  63. }
  64. UserSessionVO userSessionVO = new UserSessionVO();
  65. userSessionVO.setName(user.getName()).setRoleId(user.getRoleId()).setId(user.getId());
  66. return userSessionVO;
  67. }
  68. }