mybatis拦截器处理敏感字段

利用mybatis拦截器对数据库敏感字段加解密

前言

由于公司业务要求,需要在不影响已有业务上对 数据库中已有数据的敏感字段加密解密,个人解决方案利用mybatis的拦截器加密解密敏感字段

思路解析

  1. 利用注解标明需要加密解密的entity类对象以及其中的数据
  2. mybatis拦截Executor.class对象中的query,update方法
  3. 在方法执行前对parameter进行加密解密,在拦截器执行后,解密返回的结果

代码

1、配置拦截器(interceptor后为自己拦截器的包路径)

<plugins>
		<plugin interceptor="com.github.miemiedev.mybatis.paginator.OffsetLimitInterceptor">
			<property name="dialectClass" value="com.github.miemiedev.mybatis.paginator.dialect.OracleDialect" />
		</plugin>
		<plugin interceptor="com.XXX.XXXX.service.encryptinfo.DaoInterceptor" />
	</plugins>

2、拦截器的实现
特别注意:因为Dao方法参数有可能单一参数,多参数map形式,以及entity对象参数类型,所以不通类型需有不通的处理方式(本文参数 单一字符串和entity对象,返回的结果集 List<?> 和entity)
后续在拦截器中添加了相应的开关,控制参数是否加密查询,解密已实现兼容

package com.ips.fpms.service.encryptinfo;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import com.xxx.xxx.dao.WhiteListDao;
import com.xxx.xxx.entity.db.WhiteListEntity;
import com.xxx.xxx.service.util.SpringBeanUtils;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.xxx.xxx.annotation.EncryptField;
import com.xxx.xxx.annotation.EncryptMethod;
import com.xxx.xxx.common.utils.CloneUtil;
import com.xxx.core.psfp.common.support.JsonUtils;
import com.xxx.xxx.service.util.CryptPojoUtils;

@Intercepts({
   
    @Signature(type=Executor.class,method="update",args={
   MappedStatement.class,Object.class}),
    @Signature(type=Executor.class,method="query",args={
   MappedStatement.class,Object.class,RowBounds.class,ResultHandler.class})
})
public class EncryptDaoInterceptor implements Interceptor{
   
	private final Logger logger = LoggerFactory.getLogger(EncryptDaoInterceptor.class);
	private WhiteListDao whiteListDao;
	static int MAPPED_STATEMENT_INDEX = 0;
	static int PARAMETER_INDEX = 1;
	static int ROWBOUNDS_INDEX = 2;
	static int RESULT_HANDLER_INDEX = 3;
	static String ENCRYPTFIELD = "1";
	static String DECRYPTFIELD = "2";
	private static final String ENCRYPT_KEY = "encry146local";
	private static final String ENCRYPT_NUM = "146";
	private static boolean ENCRYPT_SWTICH = true;
	/**
	 * 是否进行加密查询
	 * @return 1 true 代表加密 0 false 不加密
	 */
	private boolean getFuncSwitch(){
   
		if(whiteListDao == null){
   
			whiteListDao = SpringBeanUtils.getBean("whiteListDao",WhiteListDao.class);
		}
		try{
   
			WhiteListEntity entity = whiteListDao.selectOne(ENCRYPT_KEY,ENCRYPT_NUM);
			if(entity!=null<
  • 1
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
QueryWrapper和LambdaQueryWrapper是MyBatis-Plus框架中用于构建SQL查询条件的两种方式。 QueryWrapper的使用方式如下: ```java QueryWrapper<User> wrapper = new QueryWrapper<User>() .eq(StringUtils.isNotBlank(user.getNickName()), "nick", user.getNickName()) .eq(user.getId() != null,"id", user.getId()); List<User> userList = userDao.selectList(wrapper); ``` 而LambdaQueryWrapper的使用方式如下: ```java LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>() .eq(StringUtils.isNotBlank(user.getNickName()), User::getNickName, user.getNickName()) .eq(user.getId() != null, User::getId, user.getId()); List<User> userList = userDao.selectList(wrapper); ``` 它们的使用区别在于列名匹配方式不同。QueryWrapper使用的是数据库中的字段名(一般是下划线规则),而LambdaQueryWrapper使用的是Lambda的语法,偏向于对象。LambdaQueryWrapper的一个优点是不用写列名,而是使用纯Java的方式,避免了拼写错误。另外,LambdaQueryWrapper的写法如果有错,则在编译期就会报错,而QueryWrapper需要在运行时才会报错。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [LambdaQueryWrapper和QueryWapper的区别](https://blog.csdn.net/weixin_46130858/article/details/125989769)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值