SecurityAccessTokenResolver.java 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package com.dragoninfo.dcuc.authweb.interceptor;
  2. import cn.hutool.core.util.StrUtil;
  3. import com.dragoninfo.dcuc.auth.auth.facade.IBimBusinessFacade;
  4. import com.dragoninfo.dcuc.auth.auth.vo.bim.BimUserInfoItemRespVO;
  5. import com.dragoninfo.dcuc.auth.sub.dto.AuthUserContactDTO;
  6. import com.dragoninfo.dcuc.auth.sub.facade.IAuthUserInfoFacade;
  7. import com.dragoninfo.dcuc.authweb.util.HeadTokenUtils;
  8. import com.dragoninfo.dcuc.common.enums.UserExtInfoEnum;
  9. import com.dragonsoft.duceap.base.api.security.ISecurityAccessTokenResolver;
  10. import com.dragonsoft.duceap.base.entity.security.BaseSecurityUser;
  11. import com.dragonsoft.duceap.base.entity.security.SecurityUser;
  12. import com.dragonsoft.duceap.commons.util.UrlMatcher;
  13. import com.dragonsoft.duceap.commons.util.json.JsonUtils;
  14. import com.dragonsoft.duceap.commons.util.string.StringUtils;
  15. import com.dragonsoft.duceap.security.jwt.SecurityUserCacheResolver;
  16. import com.dragonsoft.duceap.security.jwt.securityaccess.SecurityAccessTokenProperties;
  17. import lombok.extern.slf4j.Slf4j;
  18. import org.springframework.beans.factory.annotation.Autowired;
  19. import org.springframework.boot.autoconfigure.web.ServerProperties;
  20. import org.springframework.stereotype.Component;
  21. import javax.servlet.http.HttpServletRequest;
  22. import java.util.HashMap;
  23. import java.util.Map;
  24. /**
  25. * @author huangzqa
  26. * @date 2021/4/15
  27. **/
  28. @Slf4j
  29. @Component
  30. public class SecurityAccessTokenResolver implements ISecurityAccessTokenResolver {
  31. @Autowired
  32. private SecurityAccessTokenProperties secAccessProp;
  33. @Autowired(required = false)
  34. private SecurityUserCacheResolver cacheResolver;
  35. @Autowired
  36. private IBimBusinessFacade bimBusinessFacade;
  37. @Autowired
  38. private IAuthUserInfoFacade authUserInfoFacade;
  39. @Autowired
  40. private ServerProperties serverProperties;
  41. public static final String FILTER_URL = "/js/*|/img/*|/css/*|/api/*|/*.png|/rest/*|/webSocket/*|" +
  42. "/oauthLogin/*|/authorizationPage.html|/importAuthorizationFile.html|/license/LicenseManagerServlet|" +
  43. "/authorizationFile/";
  44. @Override
  45. public BaseSecurityUser resolve(HttpServletRequest request) {
  46. String contextPath = serverProperties.getServlet().getContextPath();
  47. String requestUri = request.getRequestURI();
  48. log.debug("Security filter origin uri:{}", requestUri);
  49. // 去除上下文
  50. requestUri = requestUri.substring(contextPath.length());
  51. log.debug("Security filter not context uri:{}", requestUri);
  52. String[] splitUrls = FILTER_URL.split("\\|");
  53. log.debug("splitUrls:{} .", JsonUtils.toJSONString(splitUrls));
  54. if (UrlMatcher.matches(requestUri, splitUrls)) {
  55. log.debug("URI:{} Not need get user info.", requestUri);
  56. return null;
  57. }
  58. String userToken = HeadTokenUtils.getUserToken(request);
  59. String appToken = HeadTokenUtils.getAppToken(request);
  60. log.info("用户令牌id:{} , 应用令牌id:{}", userToken, appToken);
  61. if (StrUtil.isBlank(userToken)) {
  62. log.error("用户令牌为空");
  63. return null;
  64. }
  65. if (cacheResolver != null) {
  66. //从缓存中取
  67. SecurityUser securityUserCache = cacheResolver.getIfPresent(userToken);
  68. if (securityUserCache != null) {
  69. log.info("Cache securityUserCache:{}", JsonUtils.toJSONString(securityUserCache));
  70. return securityUserCache;
  71. }
  72. }
  73. BimUserInfoItemRespVO userInfoItemRespVO = bimBusinessFacade.getUserInfoByUserToken(userToken);
  74. String sfzh = userInfoItemRespVO.getSfzh();
  75. log.info("认证结果返回人员身份证号:{}, ", sfzh);
  76. AuthUserContactDTO userInfo = authUserInfoFacade.getUserWithContactByIdcard(sfzh);
  77. SecurityUser securityUser = new SecurityUser();
  78. securityUser.setId(userInfo.getId());
  79. securityUser.setCode(userInfo.getPoliceNumber());
  80. securityUser.setUserName(userInfo.getIdcard());
  81. securityUser.setIdcard(userInfo.getIdcard());
  82. securityUser.setName(userInfo.getName());
  83. securityUser.setPoliceNo(userInfo.getPoliceNumber());
  84. securityUser.setSecurityOrg(userInfo.getOrgCode());
  85. securityUser.setSecurityOrgName(userInfo.getOrgName());
  86. securityUser.setManType(userInfo.getManType());
  87. securityUser.setSex(userInfo.getSex());
  88. securityUser.setTelephone(userInfo.getPhone());
  89. securityUser.setManId(userInfo.getId());
  90. securityUser.setDeptId(userInfo.getOrgId());
  91. securityUser.setMobile(StringUtils.isBlank(userInfo.getMobileWork()) ? userInfo.getMobilePrivate() : userInfo.getMobileWork());
  92. securityUser.setEmail(userInfo.getEmail());
  93. securityUser.setQq(userInfo.getQqAccount());
  94. securityUser.setWechat(userInfo.getWxAccount());
  95. securityUser.setUserType(userInfo.getUserType());
  96. securityUser.setSecurityOrgs(new String[]{userInfo.getOrgCode()});
  97. // 设置令牌扩展信息
  98. Map<String, Object> map = new HashMap<>(UserExtInfoEnum.values().length);
  99. map.put(UserExtInfoEnum.USER_TOKEN_ID.getValue(), userToken);
  100. map.put(UserExtInfoEnum.APP_TOKEN_ID.getValue(), appToken);
  101. securityUser.setExtendtions(map);
  102. log.info("人员身份证号:{}, 人员信息:{}", sfzh, JsonUtils.toJSONString(userInfo));
  103. //放入缓存
  104. if (cacheResolver != null) {
  105. cacheResolver.put(userToken, securityUser);
  106. }
  107. log.info("返回人员身份证号:{}, 登录人员信息:{}", sfzh, JsonUtils.toJSONString(securityUser));
  108. return securityUser;
  109. }
  110. }