package com.dragoninfo.dcuc.authweb.interceptor; import cn.hutool.core.util.StrUtil; import com.dragoninfo.dcuc.auth.auth.facade.IBimBusinessFacade; import com.dragoninfo.dcuc.auth.auth.vo.bim.BimUserInfoItemRespVO; import com.dragoninfo.dcuc.common.Constants; import com.dragoninfo.dcuc.user.user.entity.UserInfo; import com.dragoninfo.dcuc.user.user.facade.IUserFacade; import com.dragonsoft.duceap.base.api.security.ISecurityAccessTokenResolver; import com.dragonsoft.duceap.base.entity.security.BaseSecurityUser; import com.dragonsoft.duceap.base.entity.security.SecurityUser; import com.dragonsoft.duceap.commons.util.UrlMatcher; import com.dragonsoft.duceap.commons.util.json.JsonUtils; import com.dragonsoft.duceap.security.jwt.securityaccess.SecurityAccessTokenProperties; import com.dragonsoft.duceap.security.jwt.securityaccess.SecurityAccessUserCacheResolver; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.web.ServerProperties; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; /** * @author huangzqa * @date 2021/4/15 **/ @Slf4j @Component public class SecurityAccessTokenResolver implements ISecurityAccessTokenResolver { @Autowired private SecurityAccessTokenProperties secAccessProp; @Autowired(required = false) private SecurityAccessUserCacheResolver cacheResolver; @Autowired private IBimBusinessFacade bimBusinessFacade; @Autowired private IUserFacade userFacade; @Autowired private ServerProperties serverProperties; public static final String FILTER_URL = "/js/*|/img/*|/css/*|/api/*|/*.png|/rest/*|/webSocket/*|" + "/oauthLogin/*|/authorizationPage.html|/importAuthorizationFile.html|/license/LicenseManagerServlet|" + "/authorizationFile/"; @Override public BaseSecurityUser resolve(HttpServletRequest request) { String contextPath = serverProperties.getServlet().getContextPath(); String requestUri = request.getRequestURI(); log.debug("Security filter origin uri:{}", requestUri); // 去除上下文 requestUri = requestUri.substring(contextPath.length()); log.debug("Security filter not context uri:{}", requestUri); String[] splitUrls = FILTER_URL.split("\\|"); log.debug("splitUrls:{} .", JsonUtils.toJSONString(splitUrls)); if (UrlMatcher.matches(requestUri, splitUrls)) { log.debug("URI:{} Not need get user info.", requestUri); return null; } String userToken = request.getHeader(secAccessProp.getUserTokenHeaderName()); String appToken = request.getHeader(Constants.APP_TOKEN); log.info("userToken:{},appToken:{}", userToken, appToken); if (cacheResolver != null) { //从缓存中取 SecurityUser securityUserCache = (SecurityUser) cacheResolver.getIfPresent(cacheResolver.cacheKey(userToken)); if (securityUserCache != null) { log.info("Cache securityUserCache:{}", JsonUtils.toJSONString(securityUserCache)); return securityUserCache; } } if (StrUtil.isBlank(userToken)) { return null; } BimUserInfoItemRespVO userInfoItemRespVO = bimBusinessFacade.getUserInfoByUserToken(userToken); String sfzh = userInfoItemRespVO.getSfzh(); UserInfo userInfo = userFacade.detailBySfzh(sfzh); log.info("idcard:{}, userInfo :{}", sfzh, JsonUtils.toJSONString(userInfo)); SecurityUser securityUser = new SecurityUser(); securityUser.setId(userInfo.getId()); securityUser.setName(userInfo.getName()); securityUser.setUserName(userInfo.getIdcard()); securityUser.setPoliceNo(userInfo.getPoliceNumber()); securityUser.setIdcard(userInfo.getIdcard()); securityUser.setSecurityOrg(userInfo.getOrgCode()); securityUser.setSecurityOrgName(userInfo.getOrgName()); //放入缓存 if (cacheResolver != null) { cacheResolver.put(cacheResolver.cacheKey(userToken), securityUser); } log.info("return idcard:{}, securityUser :{}", sfzh, JsonUtils.toJSONString(securityUser)); return securityUser; } }