refactor(bonus-material): 重构数据加解密拦截器

- 优化了数据加密和解密的逻辑,提高了代码的可扩展性和维护性
- 增加了对空对象的判断,提高了代码的健壮性
- 优化了日志输出,增加了异常日志的空判断和错误处理
- 注释了未使用的拦截器方法,为未来可能的需求做准备
This commit is contained in:
syruan 2025-06-16 15:39:19 +08:00
parent e78c6a2f0e
commit 4f133288a3
1 changed files with 55 additions and 22 deletions

View File

@ -24,13 +24,14 @@ import java.util.Properties;
* @author weiweiwang * @author weiweiwang
*/ */
@Intercepts({ @Intercepts({
@Signature(type = ParameterHandler.class, method = "setParameters", args = {PreparedStatement.class}), // @Signature(type = ParameterHandler.class, method = "setParameters", args = {PreparedStatement.class}),
@Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {Statement.class}) // @Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {Statement.class})
}) })
public class DataEnDecryptInterceptor implements Interceptor { public class DataEnDecryptInterceptor implements Interceptor {
protected final Logger logger = LoggerFactory.getLogger(this.getClass()); protected final Logger logger = LoggerFactory.getLogger(this.getClass());
final static String USER_MAPPER_ID = "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"; final static String USER_MAPPER_ID = "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN";
final static String DEPT_MAPPER_ID = "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNxxxNNN"; final static String DEPT_MAPPER_ID = "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNxxxNNN";
@Override @Override
public Object intercept(Invocation invocation) throws Throwable { public Object intercept(Invocation invocation) throws Throwable {
try { try {
@ -68,7 +69,7 @@ public class DataEnDecryptInterceptor implements Interceptor {
return invocation.proceed(); return invocation.proceed();
} }
catch (Exception e){ catch (Exception e){
logger.error("mybatis对敏感数据加解密拦截器异常报错{}",e.getMessage ()); logger.error("mybatis对敏感数据加解密拦截器异常报错", e);
return invocation.proceed(); return invocation.proceed();
} }
} }
@ -83,28 +84,42 @@ public class DataEnDecryptInterceptor implements Interceptor {
} }
private void encryptUserObject(Object parameterObject){ private void encryptUserObject(Object parameterObject){
if (parameterObject == null) {
logger.warn("encryptUserObject: parameterObject is null");
return;
}
if (parameterObject instanceof BmProject) { if (parameterObject instanceof BmProject) {
BmProject pro = (BmProject) parameterObject; BmProject pro = (BmProject) parameterObject;
// 加密敏感字段 // 加密敏感字段
encryptField(pro, "telphone");
if (pro.getTelphone() != null) {
pro.setTelphone(Sm4Utils.encrypt(pro.getTelphone()));
}
} }
} }
private void encryptDeptObject(Object parameterObject) { private void encryptDeptObject(Object parameterObject) {
if (parameterObject == null) {
logger.warn("encryptDeptObject: parameterObject is null");
return;
}
if (parameterObject instanceof SysDept) { if (parameterObject instanceof SysDept) {
SysDept dept = (SysDept) parameterObject; SysDept dept = (SysDept) parameterObject;
// 加密敏感字段 // 加密敏感字段
if (dept.getEmail() != null) { encryptField(dept, "email");
dept.setEmail(Sm4Utils.encrypt(dept.getEmail())); encryptField(dept, "phone");
}
if (dept.getPhone() != null) {
dept.setPhone(Sm4Utils.encrypt(dept.getPhone()));
}
} }
}
private void encryptField(Object obj, String fieldName) {
try {
Field field = obj.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
Object value = field.get(obj);
if (value != null && value instanceof String) {
String encryptedValue = Sm4Utils.encrypt((String) value);
field.set(obj, encryptedValue);
}
} catch (Exception e) {
logger.error("Failed to encrypt field {} in {}", fieldName, obj.getClass().getName(), e);
}
} }
private void decryUserObject(Object result){ private void decryUserObject(Object result){
@ -119,14 +134,17 @@ public class DataEnDecryptInterceptor implements Interceptor {
} else if (result instanceof BmProject) { } else if (result instanceof BmProject) {
decryptUser ((BmProject) result); decryptUser ((BmProject) result);
} }
} catch (Exception ingore) { } catch (Exception e) {
logger.error("Error decrypting user object", e);
} }
} }
private void decryptUser(BmProject pro) {
if (pro.getTelphone() != null) { private void decryptUser(BmProject pro) {
pro.setTelphone(Sm4Utils.decrypt(pro.getTelphone())); if (pro == null) {
logger.warn("decryptUser: pro is null");
return;
} }
decryptField(pro, "telphone");
} }
private void decryDeptObject(Object result){ private void decryDeptObject(Object result){
@ -141,16 +159,31 @@ public class DataEnDecryptInterceptor implements Interceptor {
} else if (result instanceof SysDept) { } else if (result instanceof SysDept) {
decryptDept ((SysDept) result); decryptDept ((SysDept) result);
} }
} catch (Exception ingore) { } catch (Exception e) {
logger.error("Error decrypting dept object", e);
} }
} }
private void decryptDept(SysDept dept) { private void decryptDept(SysDept dept) {
if (dept.getEmail() != null) { if (dept == null) {
dept.setEmail(Sm4Utils.decrypt(dept.getEmail())); logger.warn("decryptDept: dept is null");
return;
} }
if (dept.getPhone() != null) { decryptField(dept, "email");
dept.setPhone(Sm4Utils.decrypt(dept.getPhone())); decryptField(dept, "phone");
}
private void decryptField(Object obj, String fieldName) {
try {
Field field = obj.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
Object value = field.get(obj);
if (value != null && value instanceof String) {
String decryptedValue = Sm4Utils.decrypt((String) value);
field.set(obj, decryptedValue);
}
} catch (Exception e) {
logger.error("Failed to decrypt field {} in {}", fieldName, obj.getClass().getName(), e);
} }
} }