mirror of
https://gitee.com/dromara/RuoYi-Vue-Plus.git
synced 2026-09-18 01:25:28 +08:00
update 优化 对mybatis游标查询 进行加解密支持
This commit is contained in:
parent
b37db3fd01
commit
13e8ac5f85
@ -1,11 +1,14 @@
|
|||||||
package org.dromara.common.encrypt.interceptor;
|
package org.dromara.common.encrypt.interceptor;
|
||||||
|
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
|
import org.apache.ibatis.cursor.Cursor;
|
||||||
import org.apache.ibatis.executor.resultset.ResultSetHandler;
|
import org.apache.ibatis.executor.resultset.ResultSetHandler;
|
||||||
import org.apache.ibatis.plugin.*;
|
import org.apache.ibatis.plugin.*;
|
||||||
import org.dromara.common.encrypt.core.EncryptedFieldProcessor;
|
import org.dromara.common.encrypt.core.EncryptedFieldProcessor;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.sql.Statement;
|
import java.sql.Statement;
|
||||||
|
import java.util.Iterator;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -13,10 +16,10 @@ import java.util.Properties;
|
|||||||
*
|
*
|
||||||
* @author Lion Li
|
* @author Lion Li
|
||||||
*/
|
*/
|
||||||
@Intercepts({@Signature(
|
@Intercepts({
|
||||||
type = ResultSetHandler.class,
|
@Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {Statement.class}),
|
||||||
method = "handleResultSets",
|
// MP 3.5.17 起 selectOne/selectVoOne 走游标,需一并拦截解密
|
||||||
args = {Statement.class})
|
@Signature(type = ResultSetHandler.class, method = "handleCursorResultSets", args = {Statement.class})
|
||||||
})
|
})
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public class MybatisDecryptInterceptor implements Interceptor {
|
public class MybatisDecryptInterceptor implements Interceptor {
|
||||||
@ -32,11 +35,13 @@ public class MybatisDecryptInterceptor implements Interceptor {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Object intercept(Invocation invocation) throws Throwable {
|
public Object intercept(Invocation invocation) throws Throwable {
|
||||||
// 获取执行mysql执行结果
|
|
||||||
Object result = invocation.proceed();
|
Object result = invocation.proceed();
|
||||||
if (result == null) {
|
if (result == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
if (result instanceof Cursor<?> cursor) {
|
||||||
|
return new DecryptCursor<>(cursor, encryptedFieldProcessor);
|
||||||
|
}
|
||||||
encryptedFieldProcessor.decrypt(result);
|
encryptedFieldProcessor.decrypt(result);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -61,4 +66,52 @@ public class MybatisDecryptInterceptor implements Interceptor {
|
|||||||
public void setProperties(Properties properties) {
|
public void setProperties(Properties properties) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询结果解密游标,保持 MyBatis 游标的惰性读取语义。
|
||||||
|
*
|
||||||
|
* @param <T> 查询结果类型
|
||||||
|
*/
|
||||||
|
private record DecryptCursor<T>(Cursor<T> delegate, EncryptedFieldProcessor encryptedFieldProcessor)
|
||||||
|
implements Cursor<T> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isOpen() {
|
||||||
|
return delegate.isOpen();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isConsumed() {
|
||||||
|
return delegate.isConsumed();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getCurrentIndex() {
|
||||||
|
return delegate.getCurrentIndex();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterator<T> iterator() {
|
||||||
|
Iterator<T> iterator = delegate.iterator();
|
||||||
|
return new Iterator<>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasNext() {
|
||||||
|
return iterator.hasNext();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public T next() {
|
||||||
|
T result = iterator.next();
|
||||||
|
encryptedFieldProcessor.decrypt(result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws IOException {
|
||||||
|
delegate.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user