Browse Source

修改了监督端新增用户时密码规则

dev-V1.0.9
vincent 1 month ago
parent
commit
e1aba0df9f
  1. 8
      zdxt-common/zdxt-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java
  2. 3
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bean/CryptoIntegrityData.java
  3. 3
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bean/CryptoOperationAudit.java
  4. 3
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bean/CryptoSensitiveData.java
  5. 55
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/quartz/job/SynUserInfoJob.java
  6. 57
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/CryptoSensitiveHsmService.java
  7. 153
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/CryptoSensitiveHsmServiceImpl.java
  8. 1
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/SrzUserServiceImpl.java
  9. 22
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/thirdparty/impl/PasswordPartyServiceImpl.java
  10. 1
      zdxt-modules/zdxt-system/src/main/java/org/dromara/system/service/impl/SysJobServiceImpl.java
  11. 15
      zdxt-web-server/zdxt-admin-web-server/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java
  12. 10
      zdxt-web-server/zdxt-admin-web-server/src/main/resources/application-dev.yml

8
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);
}

3
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;

3
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;

3
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;

55
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<String,String> 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<SrzUserVo> 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();
}
}

57
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/CryptoSensitiveHsmService.java

@ -0,0 +1,57 @@
package com.zdxt.enforcementcode.service;
/**
* 密评敏感字段 HSM 加密服务
* <p>
* 通过 HSM 密码服务平台对敏感字段进行加密存储,满足密评合规要求。
* 手机号/身份证号使用 SM4-CBC 对称加密,密码使用 HMAC-SM3 单向哈希。
*/
public interface CryptoSensitiveHsmService {
/**
* 加密并存储敏感字段(SM4-CBC 对称加密)
* <p>
* 调用 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 单向哈希)
* <p>
* 生成随机 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);
}

153
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<CryptoSensitiveData> 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<CryptoSensitiveData> 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;
}
}

1
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<SrzUserVo> queryList(SrzUserBo bo) {
bo.setUsername("liufangyan1");
LambdaQueryWrapper<SrzUser> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}

22
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为空");
}

1
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();
}
/**

15
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());

10
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: '执法监督码接口文档'

Loading…
Cancel
Save