|
|
@ -3,33 +3,27 @@ package com.zdxt.enforcementcode.quartz.job; |
|
|
import cn.hutool.core.util.RandomUtil; |
|
|
import cn.hutool.core.util.RandomUtil; |
|
|
import cn.hutool.crypto.digest.DigestUtil; |
|
|
import cn.hutool.crypto.digest.DigestUtil; |
|
|
import com.zdxt.enforcementcode.common.util.IdCardCryptoUtil; |
|
|
import com.zdxt.enforcementcode.common.util.IdCardCryptoUtil; |
|
|
import com.zdxt.enforcementcode.domain.bean.UserSearchDto; |
|
|
|
|
|
import com.zdxt.enforcementcode.domain.bo.SrzUserBo; |
|
|
import com.zdxt.enforcementcode.domain.bo.SrzUserBo; |
|
|
import com.zdxt.enforcementcode.domain.vo.SrzUserVo; |
|
|
import com.zdxt.enforcementcode.domain.vo.SrzUserVo; |
|
|
import com.zdxt.enforcementcode.service.CryptoSensitiveHsmService; |
|
|
import com.zdxt.enforcementcode.service.CryptoSensitiveHsmService; |
|
|
import com.zdxt.enforcementcode.service.ISrzUserService; |
|
|
import com.zdxt.enforcementcode.service.ISrzUserService; |
|
|
import lombok.RequiredArgsConstructor; |
|
|
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
import org.dromara.common.core.utils.StringUtils; |
|
|
import org.dromara.common.core.utils.StringUtils; |
|
|
import org.dromara.common.mybatis.helper.DataPermissionHelper; |
|
|
import org.dromara.common.mybatis.helper.DataPermissionHelper; |
|
|
import org.dromara.system.domain.bo.SysUserBo; |
|
|
import org.dromara.system.domain.bo.SysUserBo; |
|
|
import org.dromara.system.domain.vo.SysUserVo; |
|
|
import org.dromara.system.domain.vo.SysUserVo; |
|
|
import org.dromara.system.service.ISysDictDataService; |
|
|
|
|
|
import org.dromara.system.service.ISysUserService; |
|
|
import org.dromara.system.service.ISysUserService; |
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
import org.springframework.beans.factory.annotation.Value; |
|
|
import org.springframework.beans.factory.annotation.Value; |
|
|
import org.springframework.stereotype.Component; |
|
|
import org.springframework.stereotype.Component; |
|
|
|
|
|
|
|
|
import java.util.HashMap; |
|
|
|
|
|
import java.util.List; |
|
|
import java.util.List; |
|
|
import java.util.Map; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* 同步用户信息定时任务 |
|
|
* 同步用户信息定时任务 |
|
|
*/ |
|
|
*/ |
|
|
@Slf4j |
|
|
@Slf4j |
|
|
@Component |
|
|
@Component |
|
|
@RequiredArgsConstructor |
|
|
|
|
|
public class SynUserInfoJob { |
|
|
public class SynUserInfoJob { |
|
|
|
|
|
|
|
|
@Value("${srnwg.secretKey}") |
|
|
@Value("${srnwg.secretKey}") |
|
|
@ -38,23 +32,18 @@ public class SynUserInfoJob { |
|
|
@Autowired |
|
|
@Autowired |
|
|
private ISrzUserService iSrzUserService; |
|
|
private ISrzUserService iSrzUserService; |
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
|
|
private ISysDictDataService sysDictDataService; |
|
|
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
@Autowired |
|
|
private ISysUserService sysUserService; |
|
|
private ISysUserService sysUserService; |
|
|
|
|
|
|
|
|
@Autowired |
|
|
@Autowired |
|
|
private CryptoSensitiveHsmService cryptoSensitiveHsmService; |
|
|
private CryptoSensitiveHsmService cryptoSensitiveHsmService; |
|
|
|
|
|
|
|
|
public static Map<String,String> params = new HashMap<>(); |
|
|
public void run() { |
|
|
|
|
|
|
|
|
public void run(){ |
|
|
|
|
|
this.userInfo(); |
|
|
this.userInfo(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/** 同步用户数据 */ |
|
|
/** 同步用户数据 */ |
|
|
public void userInfo(){ |
|
|
public void userInfo() { |
|
|
log.info("====================> 市认证原始表 -> 业务表 同步开始"); |
|
|
log.info("====================> 市认证原始表 -> 业务表 同步开始"); |
|
|
int insertNum = 0; |
|
|
int insertNum = 0; |
|
|
int updateNum = 0; |
|
|
int updateNum = 0; |
|
|
@ -64,10 +53,15 @@ public class SynUserInfoJob { |
|
|
SrzUserBo srzUserBo = new SrzUserBo(); |
|
|
SrzUserBo srzUserBo = new SrzUserBo(); |
|
|
srzUserBo.setNeedUpdate(0L); |
|
|
srzUserBo.setNeedUpdate(0L); |
|
|
List<SrzUserVo> srzUserList = iSrzUserService.queryList(srzUserBo); |
|
|
List<SrzUserVo> srzUserList = iSrzUserService.queryList(srzUserBo); |
|
|
if (srzUserList == null || srzUserList.isEmpty() || srzUserList.size() == 0) break; |
|
|
if (srzUserList == null || srzUserList.isEmpty()) break; |
|
|
|
|
|
|
|
|
for(SrzUserVo srzUser : srzUserList){ |
|
|
for (SrzUserVo srzUser : srzUserList) { |
|
|
log.info("====> 获取数据: {}", srzUser.getUsername()); |
|
|
log.info("====> 获取数据: {}", srzUser.getUsername()); |
|
|
|
|
|
String userName = srzUser.getUsername(); |
|
|
|
|
|
if (StringUtils.isEmpty(userName)) { |
|
|
|
|
|
continue; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
SysUserBo sysUserBo = new SysUserBo(); |
|
|
SysUserBo sysUserBo = new SysUserBo(); |
|
|
sysUserBo.setSex(srzUser.getGendercode()); |
|
|
sysUserBo.setSex(srzUser.getGendercode()); |
|
|
sysUserBo.setDeptId(srzUser.getOrganizationid()); |
|
|
sysUserBo.setDeptId(srzUser.getOrganizationid()); |
|
|
@ -78,7 +72,7 @@ public class SynUserInfoJob { |
|
|
sysUserBo.setUserName(srzUser.getFullname()); |
|
|
sysUserBo.setUserName(srzUser.getFullname()); |
|
|
sysUserBo.setTaskId(srzUser.getTaskid()); |
|
|
sysUserBo.setTaskId(srzUser.getTaskid()); |
|
|
sysUserBo.setSystemId(srzUser.getSystemid()); |
|
|
sysUserBo.setSystemId(srzUser.getSystemid()); |
|
|
sysUserBo.setLoginName(srzUser.getUsername()); |
|
|
sysUserBo.setLoginName(userName); |
|
|
sysUserBo.setEffectOn(srzUser.getEffecton()); |
|
|
sysUserBo.setEffectOn(srzUser.getEffecton()); |
|
|
sysUserBo.setIsDisabled(srzUser.getIsdisabled()); |
|
|
sysUserBo.setIsDisabled(srzUser.getIsdisabled()); |
|
|
sysUserBo.setIsDeleted(srzUser.getIsdeleted()); |
|
|
sysUserBo.setIsDeleted(srzUser.getIsdeleted()); |
|
|
@ -93,7 +87,6 @@ public class SynUserInfoJob { |
|
|
mobileNumber = IdCardCryptoUtil.symmetricEncryptIdCard(secretKey, srzUser.getMobilenumber()); |
|
|
mobileNumber = IdCardCryptoUtil.symmetricEncryptIdCard(secretKey, srzUser.getMobilenumber()); |
|
|
} catch (Exception e) { |
|
|
} catch (Exception e) { |
|
|
log.error("====> AES加密手机号失败: {}", e.getMessage()); |
|
|
log.error("====> AES加密手机号失败: {}", e.getMessage()); |
|
|
mobileNumber = ""; |
|
|
|
|
|
} |
|
|
} |
|
|
sysUserBo.setMobileNumber(mobileNumber); |
|
|
sysUserBo.setMobileNumber(mobileNumber); |
|
|
sysUserBo.setPhonenumber(mobileNumber); |
|
|
sysUserBo.setPhonenumber(mobileNumber); |
|
|
@ -108,61 +101,85 @@ public class SynUserInfoJob { |
|
|
certificateNumber = IdCardCryptoUtil.symmetricEncryptIdCard(secretKey, srzUser.getCertificatenumber()); |
|
|
certificateNumber = IdCardCryptoUtil.symmetricEncryptIdCard(secretKey, srzUser.getCertificatenumber()); |
|
|
} catch (Exception e) { |
|
|
} catch (Exception e) { |
|
|
log.error("====> AES加密证件号失败: {}", e.getMessage()); |
|
|
log.error("====> AES加密证件号失败: {}", e.getMessage()); |
|
|
certificateNumber = ""; |
|
|
|
|
|
} |
|
|
} |
|
|
sysUserBo.setCertificateNumber(certificateNumber); |
|
|
sysUserBo.setCertificateNumber(certificateNumber); |
|
|
|
|
|
|
|
|
sysUserBo.setIsMappingPerson(srzUser.getIsmappingperson()); |
|
|
sysUserBo.setIsMappingPerson(srzUser.getIsmappingperson()); |
|
|
sysUserBo.randomSalt(); |
|
|
|
|
|
sysUserBo.setDelFlag("0"); |
|
|
sysUserBo.setDelFlag("0"); |
|
|
|
|
|
|
|
|
// 原有规则:MD5(loginName + password + salt) 存入 sys_user.password
|
|
|
// 查询用户是否已存在(忽略数据权限)
|
|
|
String initPassword = RandomUtil.randomNumbers(8); |
|
|
SysUserVo uniqueUser = DataPermissionHelper.ignore(() -> sysUserService.selectUserByLoginName(userName)); |
|
|
String md5Password = DigestUtil.md5Hex(sysUserBo.getLoginName() + initPassword + sysUserBo.getSalt()); |
|
|
Long userId; |
|
|
sysUserBo.setPassword(md5Password); |
|
|
boolean isNewUser = (uniqueUser == null || uniqueUser.getUserId() == null); |
|
|
|
|
|
|
|
|
String userName = srzUser.getUsername(); |
|
|
if (isNewUser) { |
|
|
if(StringUtils.isNotEmpty(userName)){ |
|
|
// 新用户:初始化密码 + salt
|
|
|
SysUserVo uniqueUser = sysUserService.selectUserByLoginName(userName); |
|
|
sysUserBo.randomSalt(); |
|
|
Long userId; |
|
|
String initPassword = RandomUtil.randomNumbers(8); |
|
|
if (null != uniqueUser && uniqueUser.getUserId() != null) { |
|
|
String md5Password = DigestUtil.md5Hex(userName + initPassword + sysUserBo.getSalt()); |
|
|
sysUserBo.setUserId(uniqueUser.getUserId()); |
|
|
sysUserBo.setPassword(md5Password); |
|
|
if (StringUtils.isEmpty(sysUserBo.getLawCertificateNum())) { |
|
|
|
|
|
sysUserBo.setLawCertificateNum(uniqueUser.getLawCertificateNum()); |
|
|
log.info("====> 新增数据: {}", userName); |
|
|
} |
|
|
int rowNum = DataPermissionHelper.ignore(() -> sysUserService.insertUser(sysUserBo)); |
|
|
log.info("====> 更新数据: {}", srzUser.getUsername()); |
|
|
insertNum += rowNum; |
|
|
int rowNum = DataPermissionHelper.ignore(() -> sysUserService.updateUser(sysUserBo)); |
|
|
userId = sysUserBo.getUserId(); |
|
|
updateNum += rowNum; |
|
|
} else { |
|
|
userId = uniqueUser.getUserId(); |
|
|
// 已有用户:不重置密码,仅更新基本信息
|
|
|
} else { |
|
|
sysUserBo.setUserId(uniqueUser.getUserId()); |
|
|
log.info("====> 新增数据: {}", srzUser.getUsername()); |
|
|
sysUserBo.setPassword(null); |
|
|
int rowNum = DataPermissionHelper.ignore(() -> sysUserService.insertUser(sysUserBo)); |
|
|
sysUserBo.setSalt(null); |
|
|
insertNum += rowNum; |
|
|
if (StringUtils.isEmpty(sysUserBo.getLawCertificateNum())) { |
|
|
userId = sysUserBo.getUserId(); |
|
|
sysUserBo.setLawCertificateNum(uniqueUser.getLawCertificateNum()); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 密评规则:HSM 加密敏感字段存入 crypto_sensitive_data 表
|
|
|
log.info("====> 更新数据: {}", userName); |
|
|
String bizId = String.valueOf(userId); |
|
|
int rowNum = DataPermissionHelper.ignore(() -> sysUserService.updateUserById(sysUserBo)); |
|
|
try { |
|
|
updateNum += rowNum; |
|
|
cryptoSensitiveHsmService.encryptAndSave("sys_user", bizId, "phonenumber", mobileNumber); |
|
|
userId = uniqueUser.getUserId(); |
|
|
cryptoSensitiveHsmService.encryptAndSave("sys_user", bizId, "mobileNumber", mobileNumber); |
|
|
} |
|
|
cryptoSensitiveHsmService.encryptAndSave("sys_user", bizId, "certificateNumber", certificateNumber); |
|
|
|
|
|
cryptoSensitiveHsmService.hashAndSavePassword("sys_user", bizId, md5Password); |
|
|
|
|
|
} catch (Exception e) { |
|
|
|
|
|
log.error("====> HSM加密敏感字段失败, userId={}, error={}", bizId, e.getMessage()); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
srzUser.setNeedUpdate(1L); |
|
|
// 密评规则:HSM 加密敏感字段存入 crypto_sensitive_data 表
|
|
|
int srz_num = iSrzUserService.update(srzUser); |
|
|
String bizId = String.valueOf(userId); |
|
|
rowNom_srz += srz_num; |
|
|
try { |
|
|
|
|
|
String phoneCipher = cryptoSensitiveHsmService.encryptAndSave("sys_user", bizId, "phonenumber", mobileNumber); |
|
|
|
|
|
String idCardCipher = cryptoSensitiveHsmService.encryptAndSave("sys_user", bizId, "certificateNumber", certificateNumber); |
|
|
|
|
|
// 密码:仅新用户进行 HSM 加密,已有用户密码不动
|
|
|
|
|
|
String passwordCipher = null; |
|
|
|
|
|
SysUserBo updateBo = new SysUserBo(); |
|
|
|
|
|
updateBo.setUserId(userId); |
|
|
|
|
|
if (isNewUser) { |
|
|
|
|
|
passwordCipher = cryptoSensitiveHsmService.encryptAndSave("sys_user", bizId, "password", sysUserBo.getPassword()); |
|
|
|
|
|
updateBo.setPassword(passwordCipher); |
|
|
|
|
|
} |
|
|
|
|
|
updateBo.setPhonenumber(phoneCipher); |
|
|
|
|
|
updateBo.setCertificateNumber(idCardCipher); |
|
|
|
|
|
DataPermissionHelper.ignore(() -> sysUserService.updateUserById(updateBo)); |
|
|
|
|
|
|
|
|
|
|
|
// 数据完整性摘要:基于 sys_user 表中最终存储值
|
|
|
|
|
|
String pwdForHash; |
|
|
|
|
|
if (isNewUser) { |
|
|
|
|
|
pwdForHash = StringUtils.isNotEmpty(passwordCipher) ? passwordCipher |
|
|
|
|
|
: (StringUtils.isNotEmpty(sysUserBo.getPassword()) ? sysUserBo.getPassword() : ""); |
|
|
|
|
|
} else { |
|
|
|
|
|
pwdForHash = (uniqueUser != null && StringUtils.isNotEmpty(uniqueUser.getPassword())) ? uniqueUser.getPassword() : ""; |
|
|
|
|
|
} |
|
|
|
|
|
String phoneForHash = StringUtils.isNotEmpty(phoneCipher) ? phoneCipher : mobileNumber; |
|
|
|
|
|
String idCardForHash = StringUtils.isNotEmpty(idCardCipher) ? idCardCipher : certificateNumber; |
|
|
|
|
|
cryptoSensitiveHsmService.saveIntegrityHash("sys_user", bizId, |
|
|
|
|
|
"password,phonenumber,certificateNumber", |
|
|
|
|
|
pwdForHash, phoneForHash, idCardForHash); |
|
|
|
|
|
} catch (Exception e) { |
|
|
|
|
|
log.error("====> HSM加密敏感字段失败, userId={}, error={}", bizId, e.getMessage()); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 无论 HSM 是否成功都标记已处理,避免死循环;HSM 失败由下次全量同步补偿
|
|
|
|
|
|
srzUser.setNeedUpdate(1L); |
|
|
|
|
|
int srz_num = iSrzUserService.update(srzUser); |
|
|
|
|
|
rowNom_srz += srz_num; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
log.info("新增用户数量 : {} / 更新用户数量 : {} / 更新原始表数 : {}", insertNum, updateNum, rowNom_srz); |
|
|
log.info("新增用户数量 : {} / 更新用户数量 : {} / 更新原始表数 : {}", insertNum, updateNum, rowNom_srz); |
|
|
} catch (Exception e) { |
|
|
} catch (Exception e) { |
|
|
log.error("同步用户信息异常", e); |
|
|
log.error("同步用户信息异常", e); |
|
|
e.printStackTrace(); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|