|
@@ -1,45 +1,36 @@
|
|
package com.dragoninfo.dcuc.auth.business.impl.zerotrust;
|
|
package com.dragoninfo.dcuc.auth.business.impl.zerotrust;
|
|
|
|
|
|
import com.alibaba.fastjson.JSON;
|
|
import com.alibaba.fastjson.JSON;
|
|
-import com.alibaba.fastjson.JSONObject;
|
|
|
|
import com.dragoninfo.dcuc.app.entity.ApplyInfo;
|
|
import com.dragoninfo.dcuc.app.entity.ApplyInfo;
|
|
import com.dragoninfo.dcuc.app.facade.IApplyInfoFacade;
|
|
import com.dragoninfo.dcuc.app.facade.IApplyInfoFacade;
|
|
import com.dragoninfo.dcuc.auth.api.enums.zerotrust.ZeroTrustBusinessRespEnum;
|
|
import com.dragoninfo.dcuc.auth.api.enums.zerotrust.ZeroTrustBusinessRespEnum;
|
|
-import com.dragoninfo.dcuc.auth.api.vo.MessageRespVO;
|
|
|
|
-import com.dragoninfo.dcuc.auth.api.vo.ResultRespPageVo;
|
|
|
|
-import com.dragoninfo.dcuc.auth.api.vo.ResultRespVO;
|
|
|
|
import com.dragoninfo.dcuc.auth.api.vo.zerotrust.ZeroTrustMessageRespVO;
|
|
import com.dragoninfo.dcuc.auth.api.vo.zerotrust.ZeroTrustMessageRespVO;
|
|
import com.dragoninfo.dcuc.auth.audit.dto.TokenOperationDto;
|
|
import com.dragoninfo.dcuc.auth.audit.dto.TokenOperationDto;
|
|
import com.dragoninfo.dcuc.auth.audit.service.log.QmAuditPushService;
|
|
import com.dragoninfo.dcuc.auth.audit.service.log.QmAuditPushService;
|
|
-import com.dragoninfo.dcuc.auth.business.zerotrust.IAuthTokenBusiness;
|
|
|
|
import com.dragoninfo.dcuc.auth.business.ICacheBusiness;
|
|
import com.dragoninfo.dcuc.auth.business.ICacheBusiness;
|
|
-import com.dragoninfo.dcuc.auth.config.DcucAuthConfig;
|
|
|
|
-import com.dragoninfo.dcuc.auth.config.zerotrust.DcucAuthZerotrustConfig;
|
|
|
|
|
|
+import com.dragoninfo.dcuc.auth.business.zerotrust.IAuthTokenBusiness;
|
|
|
|
+import com.dragoninfo.dcuc.auth.business.zerotrust.ITokenRemoteCallBusiness;
|
|
import com.dragoninfo.dcuc.auth.sub.entity.AuthUserInfo;
|
|
import com.dragoninfo.dcuc.auth.sub.entity.AuthUserInfo;
|
|
import com.dragoninfo.dcuc.auth.sub.service.IAuthUserInfoService;
|
|
import com.dragoninfo.dcuc.auth.sub.service.IAuthUserInfoService;
|
|
import com.dragoninfo.dcuc.auth.sub.vo.ApplyInfoVo;
|
|
import com.dragoninfo.dcuc.auth.sub.vo.ApplyInfoVo;
|
|
import com.dragoninfo.dcuc.auth.sub.vo.AuthUserVo;
|
|
import com.dragoninfo.dcuc.auth.sub.vo.AuthUserVo;
|
|
import com.dragoninfo.dcuc.auth.token.enums.TokenActionEnum;
|
|
import com.dragoninfo.dcuc.auth.token.enums.TokenActionEnum;
|
|
import com.dragoninfo.dcuc.auth.token.vo.*;
|
|
import com.dragoninfo.dcuc.auth.token.vo.*;
|
|
-import com.dragoninfo.duceap.core.response.Result;
|
|
|
|
import com.dragonsoft.auditlog.collection.qmtj.enums.TokenTypeEnum;
|
|
import com.dragonsoft.auditlog.collection.qmtj.enums.TokenTypeEnum;
|
|
import com.dragonsoft.duceap.commons.util.string.StringUtils;
|
|
import com.dragonsoft.duceap.commons.util.string.StringUtils;
|
|
import com.dragonsoft.smtools.loader.SMFactory;
|
|
import com.dragonsoft.smtools.loader.SMFactory;
|
|
|
|
+import com.fasterxml.jackson.core.JsonProcessingException;
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
import lombok.SneakyThrows;
|
|
import lombok.SneakyThrows;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import org.apache.commons.collections4.CollectionUtils;
|
|
import org.apache.commons.collections4.CollectionUtils;
|
|
import org.springframework.beans.BeanUtils;
|
|
import org.springframework.beans.BeanUtils;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
-import org.springframework.core.ParameterizedTypeReference;
|
|
|
|
-import org.springframework.http.HttpEntity;
|
|
|
|
-import org.springframework.http.HttpMethod;
|
|
|
|
-import org.springframework.http.HttpStatus;
|
|
|
|
-import org.springframework.http.ResponseEntity;
|
|
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
-import org.springframework.web.client.RestTemplate;
|
|
|
|
|
|
|
|
-import java.util.*;
|
|
|
|
|
|
+import java.util.ArrayList;
|
|
|
|
+import java.util.Date;
|
|
|
|
+import java.util.List;
|
|
|
|
|
|
/**
|
|
/**
|
|
* token业务类
|
|
* token业务类
|
|
@@ -51,10 +42,6 @@ import java.util.*;
|
|
@Service
|
|
@Service
|
|
public class AuthTokenBusinessImpl implements IAuthTokenBusiness {
|
|
public class AuthTokenBusinessImpl implements IAuthTokenBusiness {
|
|
|
|
|
|
- private RestTemplate restTemplate;
|
|
|
|
-
|
|
|
|
- private DcucAuthZerotrustConfig zerotrustConfig;
|
|
|
|
-
|
|
|
|
private IApplyInfoFacade applyInfoFacade;
|
|
private IApplyInfoFacade applyInfoFacade;
|
|
|
|
|
|
private IAuthUserInfoService userInfoService;
|
|
private IAuthUserInfoService userInfoService;
|
|
@@ -65,7 +52,12 @@ public class AuthTokenBusinessImpl implements IAuthTokenBusiness {
|
|
|
|
|
|
private SMFactory smFactory;
|
|
private SMFactory smFactory;
|
|
|
|
|
|
- private IAuthTokenBusiness tokenBusiness;
|
|
|
|
|
|
+ private ITokenRemoteCallBusiness tokenRemoteCallBusiness;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ public void setTokenRemoteCallBusiness(ITokenRemoteCallBusiness tokenRemoteCallBusiness) {
|
|
|
|
+ this.tokenRemoteCallBusiness = tokenRemoteCallBusiness;
|
|
|
|
+ }
|
|
|
|
|
|
@Autowired
|
|
@Autowired
|
|
public void setSmFactory(SMFactory smFactory) {
|
|
public void setSmFactory(SMFactory smFactory) {
|
|
@@ -82,16 +74,6 @@ public class AuthTokenBusinessImpl implements IAuthTokenBusiness {
|
|
this.qmAuditPushService = qmAuditPushService;
|
|
this.qmAuditPushService = qmAuditPushService;
|
|
}
|
|
}
|
|
|
|
|
|
- @Autowired
|
|
|
|
- public void setZerotrustConfig(DcucAuthZerotrustConfig zerotrustConfig) {
|
|
|
|
- this.zerotrustConfig = zerotrustConfig;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- @Autowired
|
|
|
|
- public void setRestTemplate(RestTemplate restTemplate) {
|
|
|
|
- this.restTemplate = restTemplate;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
@Autowired
|
|
@Autowired
|
|
public void setApplyInfoFacade(IApplyInfoFacade applyInfoFacade) {
|
|
public void setApplyInfoFacade(IApplyInfoFacade applyInfoFacade) {
|
|
this.applyInfoFacade = applyInfoFacade;
|
|
this.applyInfoFacade = applyInfoFacade;
|
|
@@ -104,23 +86,17 @@ public class AuthTokenBusinessImpl implements IAuthTokenBusiness {
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public UserTokenInfoRespVO getUserTokenInfo(String userTokenId) {
|
|
public UserTokenInfoRespVO getUserTokenInfo(String userTokenId) {
|
|
|
|
+ // 从缓存获取的都是经过令牌签名校验的
|
|
UserTokenInfoRespVO userToken = cacheBusiness.getUserToken(userTokenId);
|
|
UserTokenInfoRespVO userToken = cacheBusiness.getUserToken(userTokenId);
|
|
if (null != userToken) {
|
|
if (null != userToken) {
|
|
return userToken;
|
|
return userToken;
|
|
}
|
|
}
|
|
|
|
|
|
// 查询用户令牌
|
|
// 查询用户令牌
|
|
- String tokenQueryUrl = zerotrustConfig.getUserTokenQueryUrl();
|
|
|
|
- Map<String, String> param = new HashMap<>();
|
|
|
|
- param.put("userTokenId", userTokenId);
|
|
|
|
-
|
|
|
|
- log.info("getUserTokenInfo url:{}, tokenId:{}", tokenQueryUrl, userTokenId);
|
|
|
|
-
|
|
|
|
- UserTokenInfoRespVO tokenInfo = getTokenInfo(tokenQueryUrl, new ParameterizedTypeReference<ResultRespVO<UserTokenInfoRespVO>>() {
|
|
|
|
- }, param);
|
|
|
|
|
|
+ UserTokenInfoRespVO userTokenInfo = tokenRemoteCallBusiness.getUserTokenInfo(userTokenId);
|
|
// 添加缓存
|
|
// 添加缓存
|
|
- cacheBusiness.userTokenActionHandle(tokenInfo, TokenActionEnum.ONLINE.getValue());
|
|
|
|
- return tokenInfo;
|
|
|
|
|
|
+ cacheBusiness.userTokenActionHandle(userTokenInfo, TokenActionEnum.ONLINE.getValue());
|
|
|
|
+ return userTokenInfo;
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
@@ -129,18 +105,11 @@ public class AuthTokenBusinessImpl implements IAuthTokenBusiness {
|
|
if (null != appToken) {
|
|
if (null != appToken) {
|
|
return appToken;
|
|
return appToken;
|
|
}
|
|
}
|
|
- // 获取应用令牌
|
|
|
|
- String tokenQueryUrl = zerotrustConfig.getAppTokenQueryUrl();
|
|
|
|
- Map<String, String> param = new HashMap<>();
|
|
|
|
- param.put("appTokenId", appTokenId);
|
|
|
|
-
|
|
|
|
- log.info("getAppTokenInfo url:{}, tokenId:{}", tokenQueryUrl, appTokenId);
|
|
|
|
-
|
|
|
|
- AppTokenInfoRespVO tokenInfo = getTokenInfo(tokenQueryUrl, new ParameterizedTypeReference<ResultRespVO<AppTokenInfoRespVO>>() {
|
|
|
|
- }, param);
|
|
|
|
|
|
+ // 查询应用令牌
|
|
|
|
+ AppTokenInfoRespVO appTokenInfo = tokenRemoteCallBusiness.getAppTokenInfo(appTokenId);
|
|
// 添加缓存
|
|
// 添加缓存
|
|
- cacheBusiness.appTokenActionHandle(tokenInfo, TokenActionEnum.ONLINE.getValue());
|
|
|
|
- return tokenInfo;
|
|
|
|
|
|
+ cacheBusiness.appTokenActionHandle(appTokenInfo, TokenActionEnum.ONLINE.getValue());
|
|
|
|
+ return appTokenInfo;
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
@@ -171,17 +140,37 @@ public class AuthTokenBusinessImpl implements IAuthTokenBusiness {
|
|
|
|
|
|
@SneakyThrows
|
|
@SneakyThrows
|
|
@Override
|
|
@Override
|
|
- public ZeroTrustMessageRespVO tokenReceive(TokenReceiveVO receiveVo) {
|
|
|
|
|
|
+ public ZeroTrustMessageRespVO tokenReceive(List<TokenReceiveVO> tokenReceiveReqVoList) {
|
|
|
|
+ if (CollectionUtils.isEmpty(tokenReceiveReqVoList)) {
|
|
|
|
+ return ZeroTrustMessageRespVO.messageEnumMessage(ZeroTrustBusinessRespEnum.SUCCESS);
|
|
|
|
+ }
|
|
|
|
+ List<TokenOperationDto> logList = new ArrayList<>();
|
|
|
|
+ for (TokenReceiveVO receiveVo : tokenReceiveReqVoList) {
|
|
|
|
+ // 校验请求签名
|
|
|
|
+ ZeroTrustMessageRespVO check = tokenReceiveSignCheck(receiveVo);
|
|
|
|
+ if (check.isRespFail()) {
|
|
|
|
+ return check;
|
|
|
|
+ }
|
|
|
|
+ // 令牌缓存处理
|
|
|
|
+ String pid = tokenReceiveCache(receiveVo);
|
|
|
|
+ TokenOperationDto dto = TokenOperationDto.builder()
|
|
|
|
+ .action(receiveVo.getAction())
|
|
|
|
+ .operateTime(new Date())
|
|
|
|
+ .pid(pid)
|
|
|
|
+ .tokenType(receiveVo.getType())
|
|
|
|
+ .build();
|
|
|
|
+ // 添加日志
|
|
|
|
+ logList.add(dto);
|
|
|
|
+ }
|
|
|
|
+ // 发送令牌处理日志
|
|
|
|
+ qmAuditPushService.pushTokenReceiveLog(logList);
|
|
|
|
+ return ZeroTrustMessageRespVO.messageEnumMessage(ZeroTrustBusinessRespEnum.SUCCESS);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private String tokenReceiveCache(TokenReceiveVO receiveVo) throws JsonProcessingException {
|
|
String action = receiveVo.getAction();
|
|
String action = receiveVo.getAction();
|
|
String type = receiveVo.getType();
|
|
String type = receiveVo.getType();
|
|
String token = receiveVo.getToken();
|
|
String token = receiveVo.getToken();
|
|
- String generalNoticeSign = generalNoticeSign(receiveVo);
|
|
|
|
- String requestSign = receiveVo.getSign();
|
|
|
|
- if (!generalNoticeSign.equalsIgnoreCase(requestSign)) {
|
|
|
|
- log.info("request Sign:{}, generalSign:{}", requestSign, generalNoticeSign);
|
|
|
|
- return ZeroTrustMessageRespVO.messageEnumMessage(ZeroTrustBusinessRespEnum.OPERATE_FAIL);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
String pid;
|
|
String pid;
|
|
ObjectMapper objectMapper = new ObjectMapper();
|
|
ObjectMapper objectMapper = new ObjectMapper();
|
|
if (TokenTypeEnum.USER.getValue().equals(type)) {
|
|
if (TokenTypeEnum.USER.getValue().equals(type)) {
|
|
@@ -193,14 +182,18 @@ public class AuthTokenBusinessImpl implements IAuthTokenBusiness {
|
|
pid = tokenInfo.getUserToken().getPid();
|
|
pid = tokenInfo.getUserToken().getPid();
|
|
cacheBusiness.appTokenActionHandle(tokenInfo, action);
|
|
cacheBusiness.appTokenActionHandle(tokenInfo, action);
|
|
}
|
|
}
|
|
- TokenOperationDto dto = TokenOperationDto.builder()
|
|
|
|
- .action(receiveVo.getAction())
|
|
|
|
- .operateTime(new Date())
|
|
|
|
- .pid(pid)
|
|
|
|
- .tokenType(receiveVo.getType())
|
|
|
|
- .build();
|
|
|
|
- qmAuditPushService.pushTokenReceiveLog(dto);
|
|
|
|
- return ZeroTrustMessageRespVO.messageEnumMessage(ZeroTrustBusinessRespEnum.SUCCESS);
|
|
|
|
|
|
+ return pid;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private ZeroTrustMessageRespVO tokenReceiveSignCheck(TokenReceiveVO receiveVo) {
|
|
|
|
+ String generalNoticeSign = generalNoticeSign(receiveVo);
|
|
|
|
+ String requestSign = receiveVo.getSign();
|
|
|
|
+ if (!generalNoticeSign.equalsIgnoreCase(requestSign)) {
|
|
|
|
+ log.info("令牌接收签名校验不通过, 请求中的签名:{}, 原文生成的签名:{}", requestSign, generalNoticeSign);
|
|
|
|
+ return ZeroTrustMessageRespVO.messageEnumMessage(ZeroTrustBusinessRespEnum.OPERATE_FAIL);
|
|
|
|
+ } else {
|
|
|
|
+ return ZeroTrustMessageRespVO.messageEnumMessage(ZeroTrustBusinessRespEnum.SUCCESS);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -210,7 +203,7 @@ public class AuthTokenBusinessImpl implements IAuthTokenBusiness {
|
|
String userTokenId = reqVo.getUserTokenId();
|
|
String userTokenId = reqVo.getUserTokenId();
|
|
String appTokenId = reqVo.getAppTokenId();
|
|
String appTokenId = reqVo.getAppTokenId();
|
|
if (StringUtils.isNotBlank(userTokenId)) {
|
|
if (StringUtils.isNotBlank(userTokenId)) {
|
|
- UserTokenInfoRespVO userToken = tokenBusiness.getUserTokenInfo(userTokenId);
|
|
|
|
|
|
+ UserTokenInfoRespVO userToken = getUserTokenInfo(userTokenId);
|
|
if (null != userToken) {
|
|
if (null != userToken) {
|
|
respVo.setUserTokenOnline(TokenActionEnum.ONLINE.getLabel());
|
|
respVo.setUserTokenOnline(TokenActionEnum.ONLINE.getLabel());
|
|
} else {
|
|
} else {
|
|
@@ -218,7 +211,7 @@ public class AuthTokenBusinessImpl implements IAuthTokenBusiness {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (StringUtils.isNotBlank(appTokenId)) {
|
|
if (StringUtils.isNotBlank(appTokenId)) {
|
|
- AppTokenInfoRespVO appToken = tokenBusiness.getAppTokenInfo(appTokenId);
|
|
|
|
|
|
+ AppTokenInfoRespVO appToken = getAppTokenInfo(appTokenId);
|
|
if (null != appToken) {
|
|
if (null != appToken) {
|
|
respVo.setAppTokenOnline(TokenActionEnum.ONLINE.getLabel());
|
|
respVo.setAppTokenOnline(TokenActionEnum.ONLINE.getLabel());
|
|
} else {
|
|
} else {
|
|
@@ -228,7 +221,6 @@ public class AuthTokenBusinessImpl implements IAuthTokenBusiness {
|
|
return respVo;
|
|
return respVo;
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
/**
|
|
/**
|
|
* 生成令牌通知签名
|
|
* 生成令牌通知签名
|
|
*
|
|
*
|
|
@@ -247,9 +239,6 @@ public class AuthTokenBusinessImpl implements IAuthTokenBusiness {
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
private AuthUserVo getAuthUserVo(String pid) {
|
|
private AuthUserVo getAuthUserVo(String pid) {
|
|
// pid为人员身份证号
|
|
// pid为人员身份证号
|
|
// 查询权限中心用户信息, 填充id字段
|
|
// 查询权限中心用户信息, 填充id字段
|
|
@@ -262,55 +251,4 @@ public class AuthTokenBusinessImpl implements IAuthTokenBusiness {
|
|
return userVo;
|
|
return userVo;
|
|
}
|
|
}
|
|
|
|
|
|
- private TokenUserInfoRespVo getTokenUserByPidRemote(String pid) {
|
|
|
|
- if (StringUtils.isBlank(pid)) {
|
|
|
|
- return null;
|
|
|
|
- }
|
|
|
|
- String url = zerotrustConfig.getUserInfoQueryUrl();
|
|
|
|
- TokenUserInfoReqVo userReqVo = new TokenUserInfoReqVo();
|
|
|
|
- userReqVo.setIdcard(pid);
|
|
|
|
- HttpEntity<TokenUserInfoReqVo> entity = new HttpEntity<>(userReqVo);
|
|
|
|
-
|
|
|
|
- log.info("getTokenUserByPid url:{}, pid:{}", url, pid);
|
|
|
|
-
|
|
|
|
- ResponseEntity<ResultRespPageVo<TokenUserInfoRespVo>> response = restTemplate.exchange(url, HttpMethod.POST, entity, new ParameterizedTypeReference<ResultRespPageVo<TokenUserInfoRespVo>>() {
|
|
|
|
- });
|
|
|
|
- ResultRespPageVo<TokenUserInfoRespVo> respBody = getRespBody(response);
|
|
|
|
- if (null == respBody) {
|
|
|
|
- return null;
|
|
|
|
- }
|
|
|
|
- ResultRespPageVo.ResultPageContent<TokenUserInfoRespVo> pageContent = respBody.getResult();
|
|
|
|
- if (null == pageContent) {
|
|
|
|
- return null;
|
|
|
|
- }
|
|
|
|
- List<TokenUserInfoRespVo> rows = pageContent.getRows();
|
|
|
|
- return CollectionUtils.isEmpty(rows) ? null : rows.get(0);
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- private <T> T getTokenInfo(String tokenQueryUrl, ParameterizedTypeReference<ResultRespVO<T>> responseType, Map<String, String> param) {
|
|
|
|
- HttpEntity<Object> entity = new HttpEntity<>(param);
|
|
|
|
- ResponseEntity<ResultRespVO<T>> response = restTemplate.exchange(tokenQueryUrl, HttpMethod.POST, entity,
|
|
|
|
- responseType);
|
|
|
|
- ResultRespVO<T> respBody = getRespBody(response);
|
|
|
|
- if (null == respBody) {
|
|
|
|
- return null;
|
|
|
|
- }
|
|
|
|
- return respBody.getResult();
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- private <T extends MessageRespVO> T getRespBody(ResponseEntity<T> response) {
|
|
|
|
- HttpStatus statusCode = response.getStatusCode();
|
|
|
|
- if (!statusCode.is2xxSuccessful()) {
|
|
|
|
- log.info("request failed, resp:{}", response);
|
|
|
|
- return null;
|
|
|
|
- }
|
|
|
|
- T body = response.getBody();
|
|
|
|
- log.info("response body:{}", JSON.toJSONString(body));
|
|
|
|
-
|
|
|
|
- if (body == null || !body.isRespSuccess()) {
|
|
|
|
- return null;
|
|
|
|
- }
|
|
|
|
- return body;
|
|
|
|
- }
|
|
|
|
}
|
|
}
|