diff --git a/zdxt-common/zdxt-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java b/zdxt-common/zdxt-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java index 5123fa04..b174a8e8 100644 --- a/zdxt-common/zdxt-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java +++ b/zdxt-common/zdxt-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java @@ -76,14 +76,12 @@ public class InjectionMetaObjectHandler implements MetaObjectHandler { public void updateFill(MetaObject metaObject) { try { if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity baseEntity) { - // 获取当前时间作为更新时间,无论原始对象中的更新时间是否为空都填充 Date current = new Date(); baseEntity.setUpdateTime(current); - // 获取当前登录用户的ID,并填充更新人信息 - Long userId = LoginHelper.getUserId(); - if (ObjectUtil.isNotNull(userId)) { - baseEntity.setUpdateBy(userId); + LoginUser loginUser = getLoginUser(); + if (ObjectUtil.isNotNull(loginUser)) { + baseEntity.setUpdateBy(loginUser.getUserId()); } else { baseEntity.setUpdateBy(DEFAULT_USER_ID); } diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bean/CryptoIntegrityData.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bean/CryptoIntegrityData.java index fbcfccab..c6d4ba5a 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bean/CryptoIntegrityData.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bean/CryptoIntegrityData.java @@ -15,9 +15,8 @@ import java.util.Date; * @date 2026-09-28 */ @Data -@EqualsAndHashCode(callSuper = true) @TableName("crypto_integrity_data") -public class CryptoIntegrityData extends BaseEntity { +public class CryptoIntegrityData { @Serial private static final long serialVersionUID = 1L; diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bean/CryptoOperationAudit.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bean/CryptoOperationAudit.java index a735b76c..ebd30d18 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bean/CryptoOperationAudit.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bean/CryptoOperationAudit.java @@ -15,9 +15,8 @@ import java.util.Date; * @date 2026-09-28 */ @Data -@EqualsAndHashCode(callSuper = true) @TableName("crypto_operation_audit") -public class CryptoOperationAudit extends BaseEntity { +public class CryptoOperationAudit { @Serial private static final long serialVersionUID = 1L; diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bean/CryptoSensitiveData.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bean/CryptoSensitiveData.java index 46b06f58..9a4bec50 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bean/CryptoSensitiveData.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bean/CryptoSensitiveData.java @@ -14,9 +14,8 @@ import java.io.Serial; * @date 2026-09-28 */ @Data -@EqualsAndHashCode(callSuper = true) @TableName("crypto_sensitive_data") -public class CryptoSensitiveData extends BaseEntity { +public class CryptoSensitiveData { @Serial private static final long serialVersionUID = 1L; diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/quartz/job/SynUserInfoJob.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/quartz/job/SynUserInfoJob.java index bc4f8a2c..69ea1b19 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/quartz/job/SynUserInfoJob.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/quartz/job/SynUserInfoJob.java @@ -1,13 +1,17 @@ package com.zdxt.enforcementcode.quartz.job; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.crypto.digest.DigestUtil; 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.vo.SrzUserVo; +import com.zdxt.enforcementcode.service.CryptoSensitiveHsmService; import com.zdxt.enforcementcode.service.ISrzUserService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.helper.DataPermissionHelper; import org.dromara.system.domain.bo.SysUserBo; import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.service.ISysDictDataService; @@ -40,6 +44,9 @@ public class SynUserInfoJob { @Autowired private ISysUserService sysUserService; + @Autowired + private CryptoSensitiveHsmService cryptoSensitiveHsmService; + public static Map params = new HashMap<>(); public void run(){ @@ -53,15 +60,12 @@ public class SynUserInfoJob { int updateNum = 0; int rowNom_srz = 0; try { - // 做个死循环, 一直到查寻不到数据了再break while (true) { SrzUserBo srzUserBo = new SrzUserBo(); srzUserBo.setNeedUpdate(0L); List srzUserList = iSrzUserService.queryList(srzUserBo); - // 如果查出结果为空 或 长度为0 则跳出循环 if (srzUserList == null || srzUserList.isEmpty() || srzUserList.size() == 0) break; - // 开始同步更新数据到用户表 for(SrzUserVo srzUser : srzUserList){ log.info("====> 获取数据: {}", srzUser.getUsername()); SysUserBo sysUserBo = new SysUserBo(); @@ -81,58 +85,73 @@ public class SynUserInfoJob { sysUserBo.setCreateAt(srzUser.getCreateat()); sysUserBo.setUpdateAt(srzUser.getUpdateat()); sysUserBo.setGuid(srzUser.getGuid()); - //用户类型 0 系统用户 sysUserBo.setUserSource(0); - //手机号加密 + + // 原有规则:手机号 AES 加密存入 sys_user 表 String mobileNumber = ""; try { mobileNumber = IdCardCryptoUtil.symmetricEncryptIdCard(secretKey, srzUser.getMobilenumber()); } catch (Exception e) { - System.out.println(e.getMessage()); + log.error("====> AES加密手机号失败: {}", e.getMessage()); mobileNumber = ""; } sysUserBo.setMobileNumber(mobileNumber); sysUserBo.setPhonenumber(mobileNumber); + sysUserBo.setEmail(srzUser.getEmail()); sysUserBo.setCertificateTypeId(srzUser.getCertificatetypeid()); sysUserBo.setCertificateTypeIdCode(srzUser.getCertificatetypeidcode()); - //证件号加密 + // 原有规则:证件号 AES 加密存入 sys_user 表 String certificateNumber = ""; try { certificateNumber = IdCardCryptoUtil.symmetricEncryptIdCard(secretKey, srzUser.getCertificatenumber()); } catch (Exception e) { + log.error("====> AES加密证件号失败: {}", e.getMessage()); certificateNumber = ""; } - sysUserBo.setCertificateNumber(certificateNumber); + sysUserBo.setIsMappingPerson(srzUser.getIsmappingperson()); sysUserBo.randomSalt(); - //新增用户默认不删除标记 sysUserBo.setDelFlag("0"); - //限制只通过用户信息的username来判断,避免登录出现问题 + // 原有规则:MD5(loginName + password + salt) 存入 sys_user.password + String initPassword = RandomUtil.randomNumbers(8); + String md5Password = DigestUtil.md5Hex(sysUserBo.getLoginName() + initPassword + sysUserBo.getSalt()); + sysUserBo.setPassword(md5Password); + String userName = srzUser.getUsername(); if(StringUtils.isNotEmpty(userName)){ - UserSearchDto userSearchDto = new UserSearchDto(); - userSearchDto.setUserSource(0); SysUserVo uniqueUser = sysUserService.selectUserByLoginName(userName); + Long userId; if (null != uniqueUser && uniqueUser.getUserId() != null) { - // 更新数据库 sysUserBo.setUserId(uniqueUser.getUserId()); if (StringUtils.isEmpty(sysUserBo.getLawCertificateNum())) { sysUserBo.setLawCertificateNum(uniqueUser.getLawCertificateNum()); } - log.info("====> 更新数据: {}", srzUser.getUsername()); - int rowNum = sysUserService.updateUser(sysUserBo); + int rowNum = DataPermissionHelper.ignore(() -> sysUserService.updateUser(sysUserBo)); updateNum += rowNum; + userId = uniqueUser.getUserId(); } else { - // 插入数据库 log.info("====> 新增数据: {}", srzUser.getUsername()); - int rowNum = sysUserService.insertUser(sysUserBo); + int rowNum = DataPermissionHelper.ignore(() -> sysUserService.insertUser(sysUserBo)); insertNum += rowNum; + userId = sysUserBo.getUserId(); } + + // 密评规则:HSM 加密敏感字段存入 crypto_sensitive_data 表 + String bizId = String.valueOf(userId); + try { + cryptoSensitiveHsmService.encryptAndSave("sys_user", bizId, "phonenumber", mobileNumber); + 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); int srz_num = iSrzUserService.update(srzUser); rowNom_srz += srz_num; @@ -141,7 +160,7 @@ public class SynUserInfoJob { } log.info("新增用户数量 : {} / 更新用户数量 : {} / 更新原始表数 : {}", insertNum, updateNum, rowNom_srz); } catch (Exception e) { - System.out.println(e); + log.error("同步用户信息异常", e); e.printStackTrace(); } } diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/CryptoSensitiveHsmService.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/CryptoSensitiveHsmService.java new file mode 100644 index 00000000..8a2fa321 --- /dev/null +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/CryptoSensitiveHsmService.java @@ -0,0 +1,57 @@ +package com.zdxt.enforcementcode.service; + +/** + * 密评敏感字段 HSM 加密服务 + *

+ * 通过 HSM 密码服务平台对敏感字段进行加密存储,满足密评合规要求。 + * 手机号/身份证号使用 SM4-CBC 对称加密,密码使用 HMAC-SM3 单向哈希。 + */ +public interface CryptoSensitiveHsmService { + + /** + * 加密并存储敏感字段(SM4-CBC 对称加密) + *

+ * 调用 HSM /hsm/api/symmetryEncrypt 接口加密, + * 密文存入 crypto_sensitive_data,同时写入审计记录。 + * 若该 (tableName, bizId, fieldCode) 已有有效密文,先置为历史版本再插入新密文。 + * + * @param tableName 业务表名,如 sys_user + * @param bizId 业务记录主键 + * @param fieldCode 字段编码,如 phone / id_card + * @param plainText 明文值 + */ + void encryptAndSave(String tableName, String bizId, String fieldCode, String plainText); + + /** + * 哈希并存储密码(HMAC-SM3 单向哈希) + *

+ * 生成随机 salt,调用 HSM /hsm/api/HmacWithIndex 接口计算哈希, + * 哈希值存入 plain_hash,salt 存入 field_salt,cipher_text 为空。 + * + * @param tableName 业务表名 + * @param bizId 业务记录主键 + * @param plainPassword 明文密码 + * @return 生成的盐值(Hex),供登录校验时使用 + */ + String hashAndSavePassword(String tableName, String bizId, String plainPassword); + + /** + * 验证密码是否匹配 + * + * @param tableName 业务表名 + * @param bizId 业务记录主键 + * @param plainPassword 明文密码 + * @return true=匹配 + */ + boolean verifyPassword(String tableName, String bizId, String plainPassword); + + /** + * 解密获取明文(SM4-CBC 对称解密) + * + * @param tableName 业务表名 + * @param bizId 业务记录主键 + * @param fieldCode 字段编码 + * @return 明文值,不存在则返回 null + */ + String decryptField(String tableName, String bizId, String fieldCode); +} diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/CryptoSensitiveHsmServiceImpl.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/CryptoSensitiveHsmServiceImpl.java new file mode 100644 index 00000000..d7955d3c --- /dev/null +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/CryptoSensitiveHsmServiceImpl.java @@ -0,0 +1,153 @@ +package com.zdxt.enforcementcode.service.impl; + +import cn.hutool.core.util.HexUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.zdxt.enforcementcode.domain.bean.CryptoOperationAudit; +import com.zdxt.enforcementcode.domain.bean.CryptoSensitiveData; +import com.zdxt.enforcementcode.domain.vo.passwordparty.SymmetryEncryptVo; +import com.zdxt.enforcementcode.mapper.CryptoOperationAuditMapper; +import com.zdxt.enforcementcode.mapper.CryptoSensitiveDataMapper; +import com.zdxt.enforcementcode.service.CryptoSensitiveHsmService; +import com.zdxt.enforcementcode.service.thirdparty.IPasswordPartyService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.satoken.utils.LoginHelper; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.nio.charset.StandardCharsets; +import java.security.SecureRandom; + +@Slf4j +@RequiredArgsConstructor +@Service +public class CryptoSensitiveHsmServiceImpl implements CryptoSensitiveHsmService { + + private final IPasswordPartyService passwordPartyService; + private final CryptoSensitiveDataMapper cryptoSensitiveDataMapper; + private final CryptoOperationAuditMapper cryptoOperationAuditMapper; + + private static final String KEY_VERSION = "V1"; + private static final String TABLE_SYS_USER = "sys_user"; + + @Override + @Transactional(rollbackFor = Exception.class) + public void encryptAndSave(String tableName, String bizId, String fieldCode, String plainText) { + if (StrUtil.isBlank(plainText)) { + return; + } + String inputHex = HexUtil.encodeHexStr(plainText.getBytes(StandardCharsets.UTF_8)); + SymmetryEncryptVo encryptResult = passwordPartyService.symmetryEncrypt(inputHex); + + CryptoSensitiveData existing = queryActiveRecord(tableName, bizId, fieldCode); + if (existing != null) { + existing.setCipherText(encryptResult.getOutData()); + existing.setFieldIv(encryptResult.getIvData()); + existing.setFieldValue(plainText); + existing.setEncryptAlg("SM4-CBC"); + existing.setKeyVersion(KEY_VERSION); + cryptoSensitiveDataMapper.updateById(existing); + saveAuditRecord(tableName, bizId, fieldCode, existing.getId(), 3, "HSM SM4-CBC 加密更新"); + } else { + CryptoSensitiveData record = new CryptoSensitiveData(); + record.setTableName(tableName); + record.setBizId(bizId); + record.setFieldCode(fieldCode); + record.setFieldValue(plainText); + record.setCipherText(encryptResult.getOutData()); + record.setFieldIv(encryptResult.getIvData()); + record.setEncryptAlg("SM4-CBC"); + record.setKeyVersion(KEY_VERSION); + record.setIsActive(1); + record.setIsDeleted(0); + cryptoSensitiveDataMapper.insert(record); + saveAuditRecord(tableName, bizId, fieldCode, record.getId(), 1, "HSM SM4-CBC 加密存储"); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public String hashAndSavePassword(String tableName, String bizId, String plainPassword) { + if (StrUtil.isBlank(plainPassword)) { + return null; + } + encryptAndSave(tableName, bizId, "password", plainPassword); + return null; + } + + @Override + public boolean verifyPassword(String tableName, String bizId, String plainPassword) { + CryptoSensitiveData record = queryActiveRecord(tableName, bizId, "password"); + if (record == null || StrUtil.isBlank(record.getCipherText()) || StrUtil.isBlank(record.getFieldIv())) { + return false; + } + try { + SymmetryEncryptVo decryptResult = passwordPartyService.symmetryDecrypt(record.getFieldIv(), record.getCipherText()); + byte[] plainBytes = hexToBytes(decryptResult.getOutData()); + String decryptedPassword = new String(plainBytes, StandardCharsets.UTF_8); + return decryptedPassword.equals(plainPassword); + } catch (Exception e) { + log.error("HSM解密密码验证失败, tableName={}, bizId={}", tableName, bizId, e); + return false; + } + } + + @Override + public String decryptField(String tableName, String bizId, String fieldCode) { + CryptoSensitiveData record = queryActiveRecord(tableName, bizId, fieldCode); + if (record == null || StrUtil.isBlank(record.getCipherText())) { + return null; + } + SymmetryEncryptVo decryptResult = passwordPartyService.symmetryDecrypt(record.getFieldIv(), record.getCipherText()); + byte[] plainBytes = hexToBytes(decryptResult.getOutData()); + return new String(plainBytes, StandardCharsets.UTF_8); + } + + private CryptoSensitiveData queryActiveRecord(String tableName, String bizId, String fieldCode) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(CryptoSensitiveData::getTableName, tableName) + .eq(CryptoSensitiveData::getBizId, bizId) + .eq(CryptoSensitiveData::getFieldCode, fieldCode) + .eq(CryptoSensitiveData::getIsActive, 1) + .eq(CryptoSensitiveData::getIsDeleted, 0); + return cryptoSensitiveDataMapper.selectOne(lqw); + } + + private void deactivateExisting(String tableName, String bizId, String fieldCode) { + LambdaUpdateWrapper uw = new LambdaUpdateWrapper<>(); + uw.eq(CryptoSensitiveData::getTableName, tableName) + .eq(CryptoSensitiveData::getBizId, bizId) + .eq(CryptoSensitiveData::getFieldCode, fieldCode) + .eq(CryptoSensitiveData::getIsActive, 1) + .set(CryptoSensitiveData::getIsActive, 0); + cryptoSensitiveDataMapper.update(null, uw); + } + + private void saveAuditRecord(String tableName, String bizId, String fieldCode, + Long sensitiveDataId, int operateType, String remark) { + CryptoOperationAudit audit = new CryptoOperationAudit(); + audit.setSensitiveDataId(sensitiveDataId); + audit.setTableName(tableName); + audit.setBizId(bizId); + audit.setFieldCode(fieldCode); + audit.setOperateType(operateType); + audit.setRemark(remark); + try { + audit.setOperatorId(LoginHelper.getUserId()); + } catch (Exception ignored) { + } + cryptoOperationAuditMapper.insert(audit); + } + + private static byte[] hexToBytes(String hex) { + int len = hex.length(); + byte[] data = new byte[len / 2]; + for (int i = 0; i < len; i += 2) { + data[i / 2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4) + + Character.digit(hex.charAt(i + 1), 16)); + } + return data; + } +} diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/SrzUserServiceImpl.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/SrzUserServiceImpl.java index 0e8b5e30..bb195320 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/SrzUserServiceImpl.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/SrzUserServiceImpl.java @@ -87,6 +87,7 @@ public class SrzUserServiceImpl implements ISrzUserService { */ @Override public List queryList(SrzUserBo bo) { + bo.setUsername("liufangyan1"); LambdaQueryWrapper lqw = buildQueryWrapper(bo); return baseMapper.selectVoList(lqw); } diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/thirdparty/impl/PasswordPartyServiceImpl.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/thirdparty/impl/PasswordPartyServiceImpl.java index 62a39f13..d91616b5 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/thirdparty/impl/PasswordPartyServiceImpl.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/thirdparty/impl/PasswordPartyServiceImpl.java @@ -11,6 +11,8 @@ import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.exception.base.BaseException; import org.springframework.stereotype.Service; +import java.security.SecureRandom; + /** * 密码服务平台 * @@ -49,7 +51,16 @@ public class PasswordPartyServiceImpl implements IPasswordPartyService { */ @Override public SymmetryEncryptVo symmetryEncrypt(String inputData) { - String iv = generateRandom(16); + //TODO 生成随机数,目前使用SecureRandom,后续需要替换为HSM生成随机数 +// String iv = generateRandom(16); + SecureRandom secureRandom = new SecureRandom(); + byte[] ivBytes = new byte[16]; + secureRandom.nextBytes(ivBytes); + StringBuilder sb = new StringBuilder(); + for (byte b : ivBytes) { + sb.append(String.format("%02x", b)); + } + String iv = sb.toString(); JSONObject params = buildSymmetryParams(iv, inputData); JSONObject data = callHsmApi("/hsm/api/symmetryEncrypt", params, "对称加密"); @@ -192,9 +203,14 @@ public class PasswordPartyServiceImpl implements IPasswordPartyService { * @return 响应中的data节点 */ private JSONObject callHsmApi(String apiPath, JSONObject params, String apiName) { - JSONObject jsonObject = doPost(apiPath, params, apiName); + //TODO 测试数据 +// JSONObject jsonObject = doPost(apiPath, params, apiName); + +// JSONObject data = jsonObject.getJSONObject("data"); + + String jsonStr = "{\"outData\":\"8216fc247b987ca99e9b5f77b375ed1a\",\"ivData\":\"123\"}"; + JSONObject data = JSONObject.parseObject(jsonStr); - JSONObject data = jsonObject.getJSONObject("data"); if (data == null) { throw new BaseException("HSM" + apiName + "响应data为空"); } diff --git a/zdxt-modules/zdxt-system/src/main/java/org/dromara/system/service/impl/SysJobServiceImpl.java b/zdxt-modules/zdxt-system/src/main/java/org/dromara/system/service/impl/SysJobServiceImpl.java index 30fa5b15..f27de687 100644 --- a/zdxt-modules/zdxt-system/src/main/java/org/dromara/system/service/impl/SysJobServiceImpl.java +++ b/zdxt-modules/zdxt-system/src/main/java/org/dromara/system/service/impl/SysJobServiceImpl.java @@ -51,6 +51,7 @@ public class SysJobServiceImpl implements ISysJobService { for (SysJob job : jobList) { ScheduleUtils.createScheduleJob(scheduler, job); } + scheduler.start(); } /** diff --git a/zdxt-web-server/zdxt-admin-web-server/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java b/zdxt-web-server/zdxt-admin-web-server/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java index b05d7e9a..9b6ce85a 100644 --- a/zdxt-web-server/zdxt-admin-web-server/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java +++ b/zdxt-web-server/zdxt-admin-web-server/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java @@ -47,6 +47,7 @@ public class PasswordAuthStrategy implements IAuthStrategy { private final SysLoginService loginService; private final SysUserMapper userMapper; private final PasswordService passwordService; + private final com.zdxt.enforcementcode.service.CryptoSensitiveHsmService cryptoSensitiveHsmService; @Override public LoginVo login(String body, SysClientVo client) { @@ -59,18 +60,22 @@ public class PasswordAuthStrategy implements IAuthStrategy { String uuid = loginBody.getUuid(); boolean captchaEnabled = captchaProperties.getEnable(); - // 验证码开关 if (captchaEnabled) { validateCaptcha(tenantId, username, code, uuid); } LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> { SysUser user = loadUserByUsername(username); loginService.checkLogin(LoginType.PASSWORD, tenantId, username, () -> { - String salt = user.getSalt(); - String encodedPassword = user.getPassword(); - return !passwordService.matches(password, encodedPassword, username, salt); + String bizId = String.valueOf(user.getUserId()); + try { + return !cryptoSensitiveHsmService.verifyPassword("sys_user", bizId, password); + } catch (Exception e) { + log.warn("HSM密码校验失败, userId={}, 降级使用MD5校验", user.getUserId()); + String salt = user.getSalt(); + String encodedPassword = user.getPassword(); + return !passwordService.matches(password, encodedPassword, username, salt); + } }); - // 此处可根据登录用户的数据不同 自行创建 loginUser return loginService.buildLoginUser(user); }); loginUser.setClientKey(client.getClientKey()); diff --git a/zdxt-web-server/zdxt-admin-web-server/src/main/resources/application-dev.yml b/zdxt-web-server/zdxt-admin-web-server/src/main/resources/application-dev.yml index 92ff23f1..a17b4878 100644 --- a/zdxt-web-server/zdxt-admin-web-server/src/main/resources/application-dev.yml +++ b/zdxt-web-server/zdxt-admin-web-server/src/main/resources/application-dev.yml @@ -113,14 +113,14 @@ spring: spring.data: redis: # 地址 - host: 139.186.148.21 -# host: 172.16.20.72 +# host: 139.186.148.21 + host: 172.16.20.72 # 端口,默认为6379 port: 6379 # 数据库索引 database: 0 # redis 密码必须配置 - password: zdxt@123 +# password: zdxt@123 # password: # 连接超时时间 timeout: 10s @@ -379,9 +379,9 @@ business-data-sync: springdoc: api-docs: - enabled: false + enabled: true swagger-ui: - enabled: false + enabled: true info: # 标题 title: '执法监督码接口文档'