docs 补充项目注释
This commit is contained in:
+6
-3
@@ -56,7 +56,7 @@ public class EncryptorAutoConfiguration {
|
||||
/**
|
||||
* 创建加密字段处理器。
|
||||
*
|
||||
* @param encryptorManager 加解密管理器
|
||||
* @param encryptorManager 加解密管理器
|
||||
* @param encryptContextFactory 加密上下文工厂
|
||||
* @return 加密字段处理器
|
||||
*/
|
||||
@@ -87,6 +87,11 @@ public class EncryptorAutoConfiguration {
|
||||
return new MybatisDecryptInterceptor(encryptedFieldProcessor);
|
||||
}
|
||||
|
||||
/**
|
||||
* 校验字段加解密配置完整性。
|
||||
*
|
||||
* @param properties 字段加解密配置
|
||||
*/
|
||||
private void validateEncryptorProperties(EncryptorProperties properties) {
|
||||
AlgorithmType algorithm = properties.getAlgorithm();
|
||||
if (algorithm == AlgorithmType.AES || algorithm == AlgorithmType.SM4) {
|
||||
@@ -102,5 +107,3 @@ public class EncryptorAutoConfiguration {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
+10
-3
@@ -23,7 +23,7 @@ public class EncryptedFieldProcessor {
|
||||
* 构造加密字段处理器。
|
||||
*
|
||||
* @param encryptorManager 加解密管理器
|
||||
* @param contextFactory 加密上下文工厂
|
||||
* @param contextFactory 加密上下文工厂
|
||||
*/
|
||||
public EncryptedFieldProcessor(EncryptorManager encryptorManager, EncryptContextFactory contextFactory) {
|
||||
this.encryptorManager = encryptorManager;
|
||||
@@ -58,6 +58,13 @@ public class EncryptedFieldProcessor {
|
||||
field.set(target, encryptorManager.decrypt(value, contextFactory.create(field))));
|
||||
}
|
||||
|
||||
/**
|
||||
* 递归处理对象、集合或 Map 中声明加密注解的字段。
|
||||
*
|
||||
* @param sourceObject 待处理对象
|
||||
* @param visited 已访问对象集合
|
||||
* @param fieldHandler 字段处理回调
|
||||
*/
|
||||
private void handle(Object sourceObject, Set<Object> visited, FieldHandler fieldHandler) {
|
||||
if (ObjectUtil.isNull(sourceObject) || sourceObject instanceof String || visited.contains(sourceObject)) {
|
||||
return;
|
||||
@@ -100,8 +107,8 @@ public class EncryptedFieldProcessor {
|
||||
* 处理单个加密字段。
|
||||
*
|
||||
* @param target 字段所属对象
|
||||
* @param field 加密字段
|
||||
* @param value 字段原始字符串值
|
||||
* @param field 加密字段
|
||||
* @param value 字段原始字符串值
|
||||
* @throws IllegalAccessException 字段访问失败时抛出
|
||||
*/
|
||||
void handle(Object target, Field field, String value) throws IllegalAccessException;
|
||||
|
||||
+5
@@ -11,6 +11,11 @@ import org.dromara.common.encrypt.core.IEncryptor;
|
||||
*/
|
||||
public abstract class AbstractEncryptor implements IEncryptor {
|
||||
|
||||
/**
|
||||
* 初始化加密执行者。
|
||||
*
|
||||
* @param context 加密上下文
|
||||
*/
|
||||
public AbstractEncryptor(EncryptContext context) {
|
||||
// 用户配置校验与配置注入
|
||||
}
|
||||
|
||||
+5
@@ -13,6 +13,11 @@ import org.dromara.common.encrypt.utils.EncryptUtils;
|
||||
*/
|
||||
public class Base64Encryptor extends AbstractEncryptor {
|
||||
|
||||
/**
|
||||
* 初始化 Base64 加密执行者。
|
||||
*
|
||||
* @param context 加密上下文
|
||||
*/
|
||||
public Base64Encryptor(EncryptContext context) {
|
||||
super(context);
|
||||
}
|
||||
|
||||
+6
-1
@@ -17,6 +17,11 @@ public class RsaEncryptor extends AbstractEncryptor {
|
||||
|
||||
private final EncryptContext context;
|
||||
|
||||
/**
|
||||
* 构造 RSA 加密器。
|
||||
*
|
||||
* @param context 加密上下文
|
||||
*/
|
||||
public RsaEncryptor(EncryptContext context) {
|
||||
super(context);
|
||||
String privateKey = context.getPrivateKey();
|
||||
@@ -53,7 +58,7 @@ public class RsaEncryptor extends AbstractEncryptor {
|
||||
/**
|
||||
* 解密
|
||||
*
|
||||
* @param value 待加密字符串
|
||||
* @param value 待加密字符串
|
||||
*/
|
||||
@Override
|
||||
public String decrypt(String value) {
|
||||
|
||||
+6
-1
@@ -16,6 +16,11 @@ public class Sm2Encryptor extends AbstractEncryptor {
|
||||
|
||||
private final EncryptContext context;
|
||||
|
||||
/**
|
||||
* 构造 SM2 加密器。
|
||||
*
|
||||
* @param context 加密上下文
|
||||
*/
|
||||
public Sm2Encryptor(EncryptContext context) {
|
||||
super(context);
|
||||
String privateKey = context.getPrivateKey();
|
||||
@@ -52,7 +57,7 @@ public class Sm2Encryptor extends AbstractEncryptor {
|
||||
/**
|
||||
* 解密
|
||||
*
|
||||
* @param value 待加密字符串
|
||||
* @param value 待加密字符串
|
||||
*/
|
||||
@Override
|
||||
public String decrypt(String value) {
|
||||
|
||||
+6
-1
@@ -15,6 +15,11 @@ public class Sm4Encryptor extends AbstractEncryptor {
|
||||
|
||||
private final EncryptContext context;
|
||||
|
||||
/**
|
||||
* 构造 SM4 加密器。
|
||||
*
|
||||
* @param context 加密上下文
|
||||
*/
|
||||
public Sm4Encryptor(EncryptContext context) {
|
||||
super(context);
|
||||
this.context = context;
|
||||
@@ -46,7 +51,7 @@ public class Sm4Encryptor extends AbstractEncryptor {
|
||||
/**
|
||||
* 解密
|
||||
*
|
||||
* @param value 待加密字符串
|
||||
* @param value 待加密字符串
|
||||
*/
|
||||
@Override
|
||||
public String decrypt(String value) {
|
||||
|
||||
+17
-2
@@ -32,9 +32,9 @@ public class CryptoFilter implements Filter {
|
||||
/**
|
||||
* 构造加解密过滤器。
|
||||
*
|
||||
* @param properties API 解密配置
|
||||
* @param properties API 解密配置
|
||||
* @param requestMappingHandlerMapping 请求映射处理器
|
||||
* @param handlerExceptionResolver 异常处理器
|
||||
* @param handlerExceptionResolver 异常处理器
|
||||
*/
|
||||
public CryptoFilter(ApiDecryptProperties properties,
|
||||
RequestMappingHandlerMapping requestMappingHandlerMapping,
|
||||
@@ -46,6 +46,15 @@ public class CryptoFilter implements Filter {
|
||||
EncryptUtils.validateRsaPrivateKey(properties.getPrivateKey());
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据接口注解与请求头执行请求解密和响应加密。
|
||||
*
|
||||
* @param request 原始请求
|
||||
* @param response 原始响应
|
||||
* @param chain 过滤器链
|
||||
* @throws IOException IO 异常
|
||||
* @throws ServletException Servlet 异常
|
||||
*/
|
||||
@Override
|
||||
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
|
||||
HttpServletRequest servletRequest = (HttpServletRequest) request;
|
||||
@@ -96,6 +105,9 @@ public class CryptoFilter implements Filter {
|
||||
|
||||
/**
|
||||
* 获取 ApiEncrypt 注解
|
||||
*
|
||||
* @param servletRequest 当前请求
|
||||
* @return API 加密注解
|
||||
*/
|
||||
private ApiEncrypt getApiEncryptAnnotation(HttpServletRequest servletRequest) {
|
||||
// 获取注解
|
||||
@@ -116,6 +128,9 @@ public class CryptoFilter implements Filter {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 销毁过滤器。
|
||||
*/
|
||||
@Override
|
||||
public void destroy() {
|
||||
}
|
||||
|
||||
+53
@@ -23,6 +23,9 @@ import java.nio.charset.StandardCharsets;
|
||||
*/
|
||||
public class DecryptRequestBodyWrapper extends HttpServletRequestWrapper {
|
||||
|
||||
/**
|
||||
* 请求体字节数据。
|
||||
*/
|
||||
private final byte[] body;
|
||||
|
||||
/**
|
||||
@@ -48,6 +51,11 @@ public class DecryptRequestBodyWrapper extends HttpServletRequestWrapper {
|
||||
body = decryptBody.getBytes(StandardCharsets.UTF_8);
|
||||
}
|
||||
|
||||
/**
|
||||
* 基于解密后的请求体创建字符读取器。
|
||||
*
|
||||
* @return 字符读取器
|
||||
*/
|
||||
@Override
|
||||
public BufferedReader getReader() {
|
||||
Charset charset = Charset.forName(getCharacterEncoding());
|
||||
@@ -55,46 +63,91 @@ public class DecryptRequestBodyWrapper extends HttpServletRequestWrapper {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 返回解密后请求体长度。
|
||||
*
|
||||
* @return 请求体长度
|
||||
*/
|
||||
@Override
|
||||
public int getContentLength() {
|
||||
return body.length;
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回解密后请求体长度。
|
||||
*
|
||||
* @return 请求体长度
|
||||
*/
|
||||
@Override
|
||||
public long getContentLengthLong() {
|
||||
return body.length;
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回解密后的请求体类型。
|
||||
*
|
||||
* @return JSON 内容类型
|
||||
*/
|
||||
@Override
|
||||
public String getContentType() {
|
||||
return MediaType.APPLICATION_JSON_VALUE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 返回基于解密请求体的输入流。
|
||||
*
|
||||
* @return 解密请求体输入流
|
||||
*/
|
||||
@Override
|
||||
public ServletInputStream getInputStream() {
|
||||
final ByteArrayInputStream bais = new ByteArrayInputStream(body);
|
||||
return new ServletInputStream() {
|
||||
/**
|
||||
* 读取解密请求体下一个字节。
|
||||
*
|
||||
* @return 下一个字节
|
||||
*/
|
||||
@Override
|
||||
public int read() {
|
||||
return bais.read();
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回解密请求体剩余可读字节数。
|
||||
*
|
||||
* @return 剩余字节数
|
||||
*/
|
||||
@Override
|
||||
public int available() {
|
||||
return bais.available();
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断解密请求体是否读取完毕。
|
||||
*
|
||||
* @return 是否读取完毕
|
||||
*/
|
||||
@Override
|
||||
public boolean isFinished() {
|
||||
return bais.available() == 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断解密请求体输入流是否可读。
|
||||
*
|
||||
* @return 固定为 true
|
||||
*/
|
||||
@Override
|
||||
public boolean isReady() {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置异步读取监听器。
|
||||
*
|
||||
* @param readListener 读取监听器
|
||||
*/
|
||||
@Override
|
||||
public void setReadListener(ReadListener readListener) {
|
||||
|
||||
|
||||
+66
-1
@@ -6,7 +6,10 @@ import jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.servlet.http.HttpServletResponseWrapper;
|
||||
import org.dromara.common.encrypt.utils.EncryptUtils;
|
||||
|
||||
import java.io.*;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.io.PrintWriter;
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.security.SecureRandom;
|
||||
@@ -39,6 +42,11 @@ public class EncryptResponseBodyWrapper extends HttpServletResponseWrapper {
|
||||
this.charset = resolveCharset(response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回缓存响应内容的字符输出器。
|
||||
*
|
||||
* @return 字符输出器
|
||||
*/
|
||||
@Override
|
||||
public PrintWriter getWriter() {
|
||||
if (printWriter == null) {
|
||||
@@ -48,6 +56,11 @@ public class EncryptResponseBodyWrapper extends HttpServletResponseWrapper {
|
||||
return printWriter;
|
||||
}
|
||||
|
||||
/**
|
||||
* 刷新缓存的响应输出流和字符输出器。
|
||||
*
|
||||
* @throws IOException IO 异常
|
||||
*/
|
||||
@Override
|
||||
public void flushBuffer() throws IOException {
|
||||
if (servletOutputStream != null) {
|
||||
@@ -58,11 +71,17 @@ public class EncryptResponseBodyWrapper extends HttpServletResponseWrapper {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 重置已缓存的响应内容。
|
||||
*/
|
||||
@Override
|
||||
public void reset() {
|
||||
byteArrayOutputStream.reset();
|
||||
}
|
||||
|
||||
/**
|
||||
* 重置已缓存的响应缓冲区。
|
||||
*/
|
||||
@Override
|
||||
public void resetBuffer() {
|
||||
byteArrayOutputStream.reset();
|
||||
@@ -122,29 +141,64 @@ public class EncryptResponseBodyWrapper extends HttpServletResponseWrapper {
|
||||
return encryptContent;
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回缓存响应内容的二进制输出流。
|
||||
*
|
||||
* @return 响应输出流
|
||||
*/
|
||||
@Override
|
||||
public ServletOutputStream getOutputStream() throws IOException {
|
||||
return new ServletOutputStream() {
|
||||
/**
|
||||
* 判断响应输出流是否可写。
|
||||
*
|
||||
* @return 固定为 true
|
||||
*/
|
||||
@Override
|
||||
public boolean isReady() {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置异步写入监听器。
|
||||
*
|
||||
* @param writeListener 写入监听器
|
||||
*/
|
||||
@Override
|
||||
public void setWriteListener(WriteListener writeListener) {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 写入单个字节到响应缓存。
|
||||
*
|
||||
* @param b 待写入字节
|
||||
* @throws IOException IO 异常
|
||||
*/
|
||||
@Override
|
||||
public void write(int b) throws IOException {
|
||||
byteArrayOutputStream.write(b);
|
||||
}
|
||||
|
||||
/**
|
||||
* 写入字节数组到响应缓存。
|
||||
*
|
||||
* @param b 待写入字节数组
|
||||
* @throws IOException IO 异常
|
||||
*/
|
||||
@Override
|
||||
public void write(byte[] b) throws IOException {
|
||||
byteArrayOutputStream.write(b);
|
||||
}
|
||||
|
||||
/**
|
||||
* 写入字节数组片段到响应缓存。
|
||||
*
|
||||
* @param b 待写入字节数组
|
||||
* @param off 起始偏移量
|
||||
* @param len 写入长度
|
||||
* @throws IOException IO 异常
|
||||
*/
|
||||
@Override
|
||||
public void write(byte[] b, int off, int len) throws IOException {
|
||||
byteArrayOutputStream.write(b, off, len);
|
||||
@@ -152,6 +206,12 @@ public class EncryptResponseBodyWrapper extends HttpServletResponseWrapper {
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析响应字符集,未设置时默认使用 UTF-8。
|
||||
*
|
||||
* @param response 原始响应
|
||||
* @return 响应字符集
|
||||
*/
|
||||
private Charset resolveCharset(HttpServletResponse response) {
|
||||
String characterEncoding = response.getCharacterEncoding();
|
||||
if (characterEncoding == null) {
|
||||
@@ -160,6 +220,11 @@ public class EncryptResponseBodyWrapper extends HttpServletResponseWrapper {
|
||||
return Charset.forName(characterEncoding);
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成响应内容 AES 加密密钥。
|
||||
*
|
||||
* @return AES 密钥
|
||||
*/
|
||||
private String generateAesPassword() {
|
||||
byte[] bytes = new byte[24];
|
||||
SECURE_RANDOM.nextBytes(bytes);
|
||||
|
||||
+18
@@ -23,6 +23,13 @@ public class MybatisDecryptInterceptor implements Interceptor {
|
||||
|
||||
private final EncryptedFieldProcessor encryptedFieldProcessor;
|
||||
|
||||
/**
|
||||
* 解密 MyBatis 查询结果中的加密字段。
|
||||
*
|
||||
* @param invocation 拦截调用信息
|
||||
* @return 查询结果
|
||||
* @throws Throwable 拦截处理异常
|
||||
*/
|
||||
@Override
|
||||
public Object intercept(Invocation invocation) throws Throwable {
|
||||
// 获取执行mysql执行结果
|
||||
@@ -34,11 +41,22 @@ public class MybatisDecryptInterceptor implements Interceptor {
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 包装 MyBatis 目标对象。
|
||||
*
|
||||
* @param target 目标对象
|
||||
* @return 包装后的对象
|
||||
*/
|
||||
@Override
|
||||
public Object plugin(Object target) {
|
||||
return Plugin.wrap(target, this);
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置插件属性。
|
||||
*
|
||||
* @param properties 插件属性
|
||||
*/
|
||||
@Override
|
||||
public void setProperties(Properties properties) {
|
||||
|
||||
|
||||
+18
@@ -25,6 +25,13 @@ public class MybatisEncryptInterceptor implements Interceptor {
|
||||
|
||||
private final EncryptedFieldProcessor encryptedFieldProcessor;
|
||||
|
||||
/**
|
||||
* 加密 MyBatis 入参中的加密字段,并在执行后恢复原始值。
|
||||
*
|
||||
* @param invocation 拦截调用信息
|
||||
* @return MyBatis 执行结果
|
||||
* @throws Throwable 拦截处理异常
|
||||
*/
|
||||
@Override
|
||||
public Object intercept(Invocation invocation) throws Throwable {
|
||||
List<EncryptedFieldProcessor.FieldSnapshot> snapshots = List.of();
|
||||
@@ -44,11 +51,22 @@ public class MybatisEncryptInterceptor implements Interceptor {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 包装 MyBatis 目标对象。
|
||||
*
|
||||
* @param target 目标对象
|
||||
* @return 包装后的对象
|
||||
*/
|
||||
@Override
|
||||
public Object plugin(Object target) {
|
||||
return Plugin.wrap(target, this);
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置插件属性。
|
||||
*
|
||||
* @param properties 插件属性
|
||||
*/
|
||||
@Override
|
||||
public void setProperties(Properties properties) {
|
||||
}
|
||||
|
||||
+5
@@ -381,6 +381,11 @@ public class EncryptUtils {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 校验 RSA 密钥长度是否满足最低安全要求。
|
||||
*
|
||||
* @param rsaKey RSA 密钥
|
||||
*/
|
||||
private static void validateRsaKeySize(RSAKey rsaKey) {
|
||||
int keySize = rsaKey.getModulus().bitLength();
|
||||
if (keySize < MIN_RSA_KEY_SIZE) {
|
||||
|
||||
Reference in New Issue
Block a user