|
@@ -0,0 +1,97 @@
|
|
|
+package com.dragonsoft.dcuc.approve.business.impl;
|
|
|
+
|
|
|
+import com.dragonsoft.dcuc.approve.business.ICacheBusiness;
|
|
|
+import com.dragonsoft.dcuc.approve.business.IZeroTrustTokenBusiness;
|
|
|
+import com.dragonsoft.dcuc.approve.dto.zerotrust.AppTokenInfoDTO;
|
|
|
+import com.dragonsoft.dcuc.approve.dto.zerotrust.UserTokenInfoDTO;
|
|
|
+import com.dragonsoft.dcuc.approve.enumresources.ZeroTrustBusinessRespEnum;
|
|
|
+import com.dragonsoft.dcuc.approve.enumresources.ZeroTrustTokenTypeEnum;
|
|
|
+import com.dragonsoft.dcuc.approve.model.req.v1.token.TokenReceiveVO;
|
|
|
+import com.dragonsoft.dcuc.approve.model.resp.v3.ZeroTrustMessageRespVO;
|
|
|
+import com.dragonsoft.smtools.loader.SMFactory;
|
|
|
+import com.fasterxml.jackson.core.JsonProcessingException;
|
|
|
+import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
+import lombok.SneakyThrows;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author mazq
|
|
|
+ * @date 2023/9/8
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+@Service
|
|
|
+public class ZeroTrustTokenBusinessiImpl implements IZeroTrustTokenBusiness {
|
|
|
+
|
|
|
+ private ICacheBusiness cacheBusiness;
|
|
|
+
|
|
|
+ private SMFactory smFactory;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ public void setSmFactory(SMFactory smFactory) {
|
|
|
+ this.smFactory = smFactory;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ public void setCacheBusiness(ICacheBusiness cacheBusiness) {
|
|
|
+ this.cacheBusiness = cacheBusiness;
|
|
|
+ }
|
|
|
+
|
|
|
+ @SneakyThrows
|
|
|
+ @Override
|
|
|
+ public ZeroTrustMessageRespVO tokenReceive(TokenReceiveVO receiveVo) {
|
|
|
+ // 校验请求签名
|
|
|
+ ZeroTrustMessageRespVO check = tokenReceiveSignCheck(receiveVo);
|
|
|
+ if (check.isRespFail()) {
|
|
|
+ return check;
|
|
|
+ }
|
|
|
+ // 缓存令牌到redis
|
|
|
+ tokenReceiveCache(receiveVo);
|
|
|
+
|
|
|
+ return ZeroTrustMessageRespVO.messageEnumMessage(ZeroTrustBusinessRespEnum.SUCCESS);
|
|
|
+ }
|
|
|
+
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成令牌通知签名
|
|
|
+ *
|
|
|
+ * @param tokenReceiveReqVo 应用通知信息
|
|
|
+ * @return 签名
|
|
|
+ */
|
|
|
+ public String generalNoticeSign(TokenReceiveVO tokenReceiveReqVo) {
|
|
|
+ String action = tokenReceiveReqVo.getAction();
|
|
|
+ String type = tokenReceiveReqVo.getType();
|
|
|
+ String token = tokenReceiveReqVo.getToken();
|
|
|
+ String nonce = tokenReceiveReqVo.getNonce();
|
|
|
+
|
|
|
+ String origin = "action=" + action + "&type=" + type + "&token=" + token + "&nonce=" + nonce;
|
|
|
+ log.info("noticeOrigin :{}", origin);
|
|
|
+ return smFactory.getSM3().summary(origin).toString();
|
|
|
+ }
|
|
|
+
|
|
|
+ private void tokenReceiveCache(TokenReceiveVO receiveVo) throws JsonProcessingException {
|
|
|
+ String action = receiveVo.getAction();
|
|
|
+ String type = receiveVo.getType();
|
|
|
+ String token = receiveVo.getToken();
|
|
|
+ ObjectMapper objectMapper = new ObjectMapper();
|
|
|
+ if (ZeroTrustTokenTypeEnum.USER.getValue().equals(type)) {
|
|
|
+ UserTokenInfoDTO tokenInfo = objectMapper.readValue(token, UserTokenInfoDTO.class);
|
|
|
+ cacheBusiness.userTokenActionHandle(tokenInfo, action);
|
|
|
+ } else {
|
|
|
+ AppTokenInfoDTO tokenInfo = objectMapper.readValue(token, AppTokenInfoDTO.class);
|
|
|
+ cacheBusiness.appTokenActionHandle(tokenInfo, action);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+}
|