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.auth.sub.dto.AuthUserContactDTO; import com.dragoninfo.dcuc.auth.sub.facade.IAuthUserInfoFacade; import com.dragoninfo.dcuc.authweb.util.HeadTokenUtils; import com.dragoninfo.dcuc.common.enums.UserExtInfoEnum; 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.commons.util.string.StringUtils; import com.dragonsoft.duceap.security.jwt.SecurityUserCacheResolver; import com.dragonsoft.duceap.security.jwt.securityaccess.SecurityAccessTokenProperties; 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; import java.util.HashMap; import java.util.Map; /** * @author huangzqa * @date 2021/4/15 **/ @Slf4j @Component public class SecurityAccessTokenResolver implements ISecurityAccessTokenResolver { @Autowired private SecurityAccessTokenProperties secAccessProp; @Autowired(required = false) private SecurityUserCacheResolver cacheResolver; @Autowired private IBimBusinessFacade bimBusinessFacade; @Autowired private IAuthUserInfoFacade authUserInfoFacade; @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 = HeadTokenUtils.getUserToken(request); String appToken = HeadTokenUtils.getAppToken(request); log.info("用户令牌id:{} , 应用令牌id:{}", userToken, appToken); if (StrUtil.isBlank(userToken)) { log.error("用户令牌为空"); return null; } if (cacheResolver != null) { //从缓存中取 SecurityUser securityUserCache = cacheResolver.getIfPresent(userToken); if (securityUserCache != null) { log.info("Cache securityUserCache:{}", JsonUtils.toJSONString(securityUserCache)); return securityUserCache; } } BimUserInfoItemRespVO userInfoItemRespVO = bimBusinessFacade.getUserInfoByUserToken(userToken); String sfzh = userInfoItemRespVO.getSfzh(); log.info("认证结果返回人员身份证号:{}, ", sfzh); AuthUserContactDTO userInfo = authUserInfoFacade.getUserWithContactByIdcard(sfzh); SecurityUser securityUser = new SecurityUser(); securityUser.setId(userInfo.getId()); securityUser.setCode(userInfo.getPoliceNumber()); securityUser.setUserName(userInfo.getIdcard()); securityUser.setIdcard(userInfo.getIdcard()); securityUser.setName(userInfo.getName()); securityUser.setPoliceNo(userInfo.getPoliceNumber()); securityUser.setSecurityOrg(userInfo.getOrgCode()); securityUser.setSecurityOrgName(userInfo.getOrgName()); securityUser.setManType(userInfo.getManType()); securityUser.setSex(userInfo.getSex()); securityUser.setTelephone(userInfo.getPhone()); securityUser.setManId(userInfo.getId()); securityUser.setDeptId(userInfo.getOrgId()); securityUser.setMobile(StringUtils.isBlank(userInfo.getMobileWork()) ? userInfo.getMobilePrivate() : userInfo.getMobileWork()); securityUser.setEmail(userInfo.getEmail()); securityUser.setQq(userInfo.getQqAccount()); securityUser.setWechat(userInfo.getWxAccount()); securityUser.setUserType(userInfo.getUserType()); securityUser.setSecurityOrgs(new String[]{userInfo.getOrgCode()}); // 设置令牌扩展信息 Map map = new HashMap<>(UserExtInfoEnum.values().length); map.put(UserExtInfoEnum.USER_TOKEN_ID.getValue(), userToken); map.put(UserExtInfoEnum.APP_TOKEN_ID.getValue(), appToken); securityUser.setExtendtions(map); log.info("人员身份证号:{}, 人员信息:{}", sfzh, JsonUtils.toJSONString(userInfo)); //放入缓存 if (cacheResolver != null) { cacheResolver.put(userToken, securityUser); } log.info("返回人员身份证号:{}, 登录人员信息:{}", sfzh, JsonUtils.toJSONString(securityUser)); return securityUser; } }