【添加】Schema接口开发完毕

This commit is contained in:
zer0Black
2023-10-01 13:28:05 +08:00
parent 8522219c61
commit e38cbdde77
17 changed files with 502 additions and 74 deletions
@@ -0,0 +1,35 @@
package com.jero.modules.docking.iam.annotation;
import java.lang.annotation.*;
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface IamProperty {
// /**
// * 字段属性名
// * @return
// */
// String name() default "";
//
// /**
// *
// * @return
// */
// String type() default "";
/**
* 定义对象的属性字段在创建时是否为必填字段
* @return
*/
boolean required() default true;
/**
* 定义对象的属性字段是否为多值
* @return
*/
boolean multivalued() default false;
}
@@ -1,19 +1,38 @@
package com.jero.modules.docking.iam.controller;
import com.bamboocloud.codec.BamboocloudFacade;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.jero.common.util.DateUtils;
import com.jero.common.util.UUIDGenerator;
import com.jero.common.util.UUIDUtils;
import com.jero.modules.docking.iam.dto.IamCommonAcceptDto;
import com.jero.modules.docking.iam.dto.IamOrgAcceptDto;
import com.jero.modules.docking.iam.dto.IamUserAcceptDto;
import com.jero.modules.docking.iam.dto.response.IamCommonResponseDto;
import com.jero.modules.docking.iam.dto.response.IamOrgCreateResponse;
import com.jero.modules.docking.iam.dto.response.IamSchemaResponse;
import com.jero.modules.docking.iam.dto.response.IamUserCreateResponse;
import com.jero.modules.docking.iam.exception.IamGlobalException;
import com.jero.modules.docking.iam.po.AcceptPoSystemPo;
import com.jero.modules.docking.iam.po.MessageHeader;
import com.jero.modules.docking.iam.po.SendPoSystemPo;
import com.jero.modules.docking.iam.po.SendReturnsPo;
import com.jero.modules.docking.iam.service.SyncIamService;
import com.jero.modules.docking.utils.BamboocloudUtils;
import com.jero.modules.docking.utils.DockingConstant;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.Map;
/**
* IAM同步的控制器,提供用户、组织、菜单和权限的同步
*/
@@ -22,51 +41,76 @@ import org.springframework.web.bind.annotation.RestController;
@Slf4j
public class SyncIamController {
@Resource
private SyncIamService syncIamService;
@PostMapping({"/SchemaService"})
public SendPoSystemPo<IamSchemaResponse> SchemaService(@RequestBody AcceptPoSystemPo<IamCommonResponseDto> iamCommon) {
SendPoSystemPo<IamSchemaResponse> sendPoSystemPo = new SendPoSystemPo<>();
public SendPoSystemPo SchemaService(@RequestBody AcceptPoSystemPo<IamCommonAcceptDto> iamCommon) throws JsonProcessingException {
if (iamCommon == null
|| iamCommon.getMessageTabels() == null
|| iamCommon.getMessageTabels().getHeader() == null
|| iamCommon.getMessageTabels().getHeader().getData() == null){
throw new IamGlobalException(null, "参数传递错误,未收到参数");
}
// 对核心数据解密
String bodyParam = iamCommon.getMessageTabels().getHeader().getData();
String bodyParamDecrypt = BamboocloudUtils.getPlaintext(bodyParam, DockingConstant.IAM_ENCRYPT_SECRET, DockingConstant.IAM_ENCRYPT_TYPE);
ObjectMapper objectMapper = new ObjectMapper();
IamCommonAcceptDto commonAcceptDto = objectMapper.readValue(bodyParamDecrypt, IamCommonAcceptDto.class);
// 校验身份认证,确保接口正确 必须调用!
this.syncIamService.validateUserAndPwd(commonAcceptDto);
// 处理业务逻辑,封装字段
IamSchemaResponse iamSchemaResponse = this.syncIamService.getSchemaInfo(commonAcceptDto);
// 处理统一响应PO层,并加密业务字段
MessageHeader acceptMessageHeader = iamCommon.getMessageHeader();
SendPoSystemPo sendPoSystemPo = this.syncIamService.handlerGloablResponse(acceptMessageHeader, iamSchemaResponse);
return sendPoSystemPo;
}
@PostMapping({"/UserCreateService"})
public SendPoSystemPo<IamUserCreateResponse> userCreateService(@RequestBody AcceptPoSystemPo<IamUserAcceptDto> iamUserInfo) {
SendPoSystemPo<IamUserCreateResponse> sendPoSystemPo = new SendPoSystemPo<>();
public SendPoSystemPo userCreateService(@RequestBody AcceptPoSystemPo<IamUserAcceptDto> iamUserInfo) {
SendPoSystemPo sendPoSystemPo = new SendPoSystemPo();
return sendPoSystemPo;
}
@PostMapping({"/UserUpdateService"})
public SendPoSystemPo<IamCommonResponseDto> UserUpdateService(@RequestBody AcceptPoSystemPo<IamUserAcceptDto> iamUserInfo) {
SendPoSystemPo<IamCommonResponseDto> sendPoSystemPo = new SendPoSystemPo<>();
public SendPoSystemPo UserUpdateService(@RequestBody AcceptPoSystemPo<IamUserAcceptDto> iamUserInfo) {
SendPoSystemPo sendPoSystemPo = new SendPoSystemPo();
return sendPoSystemPo;
}
@PostMapping({"/UserDeleteService"})
public SendPoSystemPo<IamCommonResponseDto> UserDeleteService(@RequestBody AcceptPoSystemPo<IamUserAcceptDto> iamUserInfo) {
SendPoSystemPo<IamCommonResponseDto> sendPoSystemPo = new SendPoSystemPo<>();
public SendPoSystemPo UserDeleteService(@RequestBody AcceptPoSystemPo<IamUserAcceptDto> iamUserInfo) {
SendPoSystemPo sendPoSystemPo = new SendPoSystemPo();
return sendPoSystemPo;
}
@PostMapping({"/OrgCreateService"})
public SendPoSystemPo<IamOrgCreateResponse> OrgCreateService(@RequestBody AcceptPoSystemPo<IamOrgAcceptDto> iamOrgInfo) {
SendPoSystemPo<IamOrgCreateResponse> sendPoSystemPo = new SendPoSystemPo<>();
public SendPoSystemPo OrgCreateService(@RequestBody AcceptPoSystemPo<IamOrgAcceptDto> iamOrgInfo) {
SendPoSystemPo sendPoSystemPo = new SendPoSystemPo();
return sendPoSystemPo;
}
@PostMapping({"/OrgUpdateService"})
public SendPoSystemPo<IamCommonResponseDto> OrgUpdateService(@RequestBody AcceptPoSystemPo<IamUserAcceptDto> iamOrgInfo) {
SendPoSystemPo<IamCommonResponseDto> sendPoSystemPo = new SendPoSystemPo<>();
public SendPoSystemPo OrgUpdateService(@RequestBody AcceptPoSystemPo<IamUserAcceptDto> iamOrgInfo) {
SendPoSystemPo sendPoSystemPo = new SendPoSystemPo();
return sendPoSystemPo;
}
@PostMapping({"/OrgDeleteService"})
public SendPoSystemPo<IamCommonResponseDto> OrgDeleteService(@RequestBody AcceptPoSystemPo<IamUserAcceptDto> iamOrgInfo) {
SendPoSystemPo<IamCommonResponseDto> sendPoSystemPo = new SendPoSystemPo<>();
public SendPoSystemPo OrgDeleteService(@RequestBody AcceptPoSystemPo<IamUserAcceptDto> iamOrgInfo) {
SendPoSystemPo sendPoSystemPo = new SendPoSystemPo();
return sendPoSystemPo;
}
@@ -16,6 +16,7 @@ public class IamOrgAcceptDto extends IamCommonAcceptDto {
/**
* 机构编码.全集团唯一,不可重复,撤销后不可重新启用
*/
private String srmsOrgCode;
/**
@@ -8,7 +8,7 @@ import java.util.List;
* Schema映射的响应体
*/
@Data
public class IamSchemaResponse extends IamCommonResponseDto{
public class IamSchemaResponse {
/**
* 请求id,收到什么就返回什么
@@ -0,0 +1,27 @@
package com.jero.modules.docking.iam.exception;
import com.jero.common.util.MessageUtils;
public class IamGlobalException extends RuntimeException {
private String bimRequestId;
private String message;
private static final long serialVersionUID = 3634632351214L;
public IamGlobalException(String bimRequestId, String message){
super(message);
this.bimRequestId = bimRequestId;
this.message = message;
}
public String getBimRequestId() {
return bimRequestId;
}
@Override
public String getMessage() {
return message;
}
}
@@ -0,0 +1,39 @@
package com.jero.modules.docking.iam.exception;
import com.jero.common.api.vo.Result;
import com.jero.common.exception.JeroBootException;
import com.jero.modules.docking.iam.dto.response.IamCommonResponseDto;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.T;
import org.apache.shiro.authz.AuthorizationException;
import org.apache.shiro.authz.UnauthorizedException;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.data.redis.connection.PoolException;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
import org.springframework.web.servlet.NoHandlerFoundException;
/**
* IAM对接全局异常处理器
*/
@RestControllerAdvice
@Slf4j
public class IamGlobalExceptionHandler {
/**
* 处理自定义异常
*/
@ExceptionHandler(IamGlobalException.class)
public IamCommonResponseDto handleJeroBootException(IamGlobalException e){
IamCommonResponseDto iamCommonResponseDto = new IamCommonResponseDto();
iamCommonResponseDto.setBimRequestId(e.getBimRequestId());
iamCommonResponseDto.setResultCode("-1"); // 错误码统一为-1
iamCommonResponseDto.setMessage(e.getMessage());
return iamCommonResponseDto;
}
}
@@ -13,6 +13,6 @@ public class AcceptPoSystemPo<T> {
private MessageHeader messageHeader;
@JsonProperty("Tables")
private MessageTabels<T> messageTabels;
private MessageTabels messageTabels;
}
@@ -7,9 +7,9 @@ import lombok.Data;
* PO系统交互必须的实体,包含接口传递的正式数据(仅为套的一层壳)
*/
@Data
public class MessageTabels<T> {
public class MessageTabels {
@JsonProperty("Header")
private T header;
private MessageTabelsHeader header;
}
@@ -0,0 +1,15 @@
package com.jero.modules.docking.iam.po;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
/**
* 接受数据的tables中的header层
*/
@Data
public class MessageTabelsHeader {
@JsonProperty("data")
private String data;
}
@@ -7,12 +7,12 @@ import lombok.Data;
* 和PO系统做数据交互的最外层壳,做数据发送用
*/
@Data
public class SendPoSystemPo<T> {
public class SendPoSystemPo {
@JsonProperty("MessageHeader")
private MessageHeader messageHeader;
@JsonProperty("Returns")
private T returns;
private SendReturnsPo returns;
}
@@ -0,0 +1,19 @@
package com.jero.modules.docking.iam.po;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
/**
* 返回数据的Return层
*/
@Data
public class SendReturnsPo {
@JsonProperty("data")
private String data;
public SendReturnsPo(String data){
this.data = data;
}
}
@@ -0,0 +1,142 @@
package com.jero.modules.docking.iam.service;
import com.bamboocloud.codec.BamboocloudFacade;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.jero.common.aspect.annotation.Translation;
import com.jero.common.util.DateUtils;
import com.jero.common.util.UUIDGenerator;
import com.jero.modules.docking.iam.annotation.IamProperty;
import com.jero.modules.docking.iam.dto.IamCommonAcceptDto;
import com.jero.modules.docking.iam.dto.IamOrgAcceptDto;
import com.jero.modules.docking.iam.dto.IamUserAcceptDto;
import com.jero.modules.docking.iam.dto.response.IamCommonResponseDto;
import com.jero.modules.docking.iam.dto.response.IamSchemaResponse;
import com.jero.modules.docking.iam.dto.response.SchemaResponseInner;
import com.jero.modules.docking.iam.exception.IamGlobalException;
import com.jero.modules.docking.iam.po.MessageHeader;
import com.jero.modules.docking.iam.po.SendPoSystemPo;
import com.jero.modules.docking.iam.po.SendReturnsPo;
import com.jero.modules.docking.utils.DockingConstant;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* IAM对接业务处理类
*/
@Service
@Transactional
public class SyncIamService {
@Value("${iam.bimRemoteUser}")
private String bimRemoteUser;
@Value("${iam.bimRemotePwd}")
private String bimRemotePwd;
/**
* 校验IAM调用时的账号密码是否正确
* 校验通过了正常走后续,不通过直接返回
* @return
*/
public void validateUserAndPwd(IamCommonAcceptDto commonAcceptDto) {
if (!bimRemoteUser.equals(commonAcceptDto.getBimRemoteUser())
|| !bimRemotePwd.equals(commonAcceptDto.getBimRemotePwd())){
throw new IamGlobalException(commonAcceptDto.getBimRequestId(), "用户名或密码不对,无法调用接口");
}
}
/**
* 生成Schema的信息
* @return
*/
public IamSchemaResponse getSchemaInfo(IamCommonAcceptDto commonAcceptDto){
// 获取用户同步的字段
List<SchemaResponseInner> accountFiledList = new ArrayList<>();
Field[] userFields = IamUserAcceptDto.class.getDeclaredFields();
this.extractedFieldProperty(accountFiledList, userFields);
// 获取组织机构同步的字段
List<SchemaResponseInner> orgFiledList = new ArrayList<>();
Field[] orgFields = IamOrgAcceptDto.class.getDeclaredFields();
this.extractedFieldProperty(orgFiledList, orgFields);
IamSchemaResponse iamSchemaResponse = new IamSchemaResponse();
iamSchemaResponse.setAccount(accountFiledList);
iamSchemaResponse.setOrganization(orgFiledList);
iamSchemaResponse.setBimRequestId(commonAcceptDto.getBimRequestId());
return iamSchemaResponse;
}
/**
* 抽取含有IamProperty注解的字段元属性
* @param filedList
* @param fields
*/
private void extractedFieldProperty(List<SchemaResponseInner> filedList, Field[] fields) {
for (Field field : fields) {
if (field.isAnnotationPresent(IamProperty.class)) {
SchemaResponseInner schemaInfo = new SchemaResponseInner();
field.setAccessible(true);
//获取Annotation对象
IamProperty iamProperty = (IamProperty) field.getAnnotation(IamProperty.class);
//提取注解对象元数据
boolean required = iamProperty.required();
boolean multivalued = iamProperty.multivalued();
String name = field.getName();
String type = field.getType().getSimpleName();
schemaInfo.setName(name);
schemaInfo.setType(type);
schemaInfo.setRequired(required);
schemaInfo.setMultivalued(multivalued);
filedList.add(schemaInfo);
}
}
}
/**
* 处理统一响应PO层,并加密业务字段
* @param acceptMessageHeader
* @param iamSchemaResponse
* @return
* @throws JsonProcessingException
*/
public SendPoSystemPo handlerGloablResponse(MessageHeader acceptMessageHeader, IamSchemaResponse iamSchemaResponse) throws JsonProcessingException {
SendPoSystemPo sendPoSystemPo = new SendPoSystemPo();
MessageHeader sendMessageHeader = new MessageHeader();
sendMessageHeader.setInterfaceID(acceptMessageHeader.getInterfaceID());
sendMessageHeader.setUUID(UUIDGenerator.generate());
sendMessageHeader.setMessageId(UUIDGenerator.generate());
sendMessageHeader.setSender(DockingConstant.SYSTEM_NAME); // 固定值,即本系统
sendMessageHeader.setReceiver(DockingConstant.IAM_SYSTEM_NAME);
Date curDate = new Date();
sendMessageHeader.setSendDate(DateUtils.formatDate(curDate, "YYYYMMDD"));
sendMessageHeader.setSendTime(DateUtils.formatDate(curDate, "hhmmss"));
ObjectMapper objectMapper = new ObjectMapper();
String returnData = objectMapper.writeValueAsString(iamSchemaResponse);
// 加密PO层外的业务数据
String encryptData = BamboocloudFacade.encrypt(returnData, DockingConstant.IAM_ENCRYPT_SECRET, DockingConstant.IAM_ENCRYPT_TYPE);
sendPoSystemPo.setMessageHeader(sendMessageHeader);
sendPoSystemPo.setReturns(new SendReturnsPo(encryptData));
return sendPoSystemPo;
}
}