文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

mybatisPlus自定义拦截器

2023-08-18 06:11

关注

一开始数据库的数据是明文存储,后面某些数据需要变成密文保存在数据库,而且密文的字段在很多数据表中都存在。进行select操作时,把密文查询出来并转成明文。
1、使用切面,当接口获取到数据后,遍历数据找到密文字段,把密文解密得到明文
2、使用mybatisPlus自定义拦截器,在sql语句执行前拦截,把 字段 改成 IFNULL(AES_DECRYPT(UNHEX(字段), 密码),字段) AS 字段,sql语句可以解密得到明文。
下面是mybatisPlus自定义拦截器的代码:

@EnableTransactionManagement@Configurationpublic class MybatisPlusConfig {    @Resource    private DataScopeInterceptor dataScopeInterceptor;    @Bean    public MybatisPlusInterceptor mybatisPlusInterceptor() {        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();        // 数据权限过滤        interceptor.addInnerInterceptor(dataScopeInterceptor);        return interceptor;    }}
@Componentpublic class DataScopeInterceptor implements InnerInterceptor {private static Set selectItemSet = new HashSet<>();    @Override    public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {        String buildSql = boundSql.getSql();        try {            Statement statement = CCJSqlParserUtil.parse(buildSql);            Select select = (Select) statement;            processSelectBody(select.getSelectBody());            PluginUtils.MPBoundSql mpBoundSql = PluginUtils.mpBoundSql(boundSql);            mpBoundSql.sql(select.toString());        } catch (JSQLParserException e) {            throw ExceptionUtils.mpe("Failed to process, Error SQL: %s", e.getCause(), buildSql);        } catch (BaseBusinessException be) {            log.warn(be.getMessage());        }    }    private void processSelectBody(SelectBody selectBody) throws BaseBusinessException, JSQLParserException {        if (selectBody == null) {            throw new BaseBusinessException(ResponseCodeEnum.IGNORE_DATA_SCOPE);            // return;        }        if (selectBody instanceof PlainSelect) {            processPlainSelect((PlainSelect) selectBody);        } else if (selectBody instanceof WithItem) {            WithItem withItem = (WithItem) selectBody;            processSelectBody(withItem.getSelectBody());        } else {            SetOperationList operationList = (SetOperationList) selectBody;            List selectBodys = operationList.getSelects();            if (CollectionUtils.isNotEmpty(selectBodys)) {                for (SelectBody body : selectBodys) {                    processSelectBody(body);                }            }        }    }    private void proprocessPlainSelect(PlainSelect plainSelect) throws JSQLParserException {        if(selectItemSet.size()>0) selectItemSet = new HashSet<>();        FromItem fromItem = plainSelect.getFromItem();        List joins = plainSelect.getJoins();        processSelectColumns(plainSelect, fromItem);        if (CollectionUtils.isNotEmpty(joins)) {            for (Join join : joins) {                if (join.isInner() || join.isFull() || join.isSimple()) {                    FromItem rightItem = join.getRightItem();                    processSelectColumns(plainSelect, rightItem);                } else if (join.isLeft()) {                    FromItem rightItem = join.getRightItem();                    processSelectColumns(plainSelect, rightItem);                } else if (join.isRight()) {                    FromItem rightItem = join.getRightItem();                    processSelectColumns(plainSelect, rightItem);                }            }        }        if (selectItemSet.size() == 0) return;        List filterItem = new ArrayList<>();        List selectItemList=selectItemSet.stream()                .filter(e -> {                    boolean found = !filterItem.contains(e.toString());                    filterItem.add(e.toString());                    return found;                })                .collect(Collectors.toList());        if (selectItemList.size() > 0) {            plainSelect.setSelectItems(selectItemList);        }    }    // select时解密; *号根据具体的表替换成具体的字段    private void processSelectColumns(PlainSelect plainSelect, FromItem fromItem) {    if (! (fromItem instanceof Table)) return;        Table table = (Table) fromItem;        for (SelectItem selectItem : plainSelect.getSelectItems()) {        // 1、做判断,不是需要解密的字段和*号就直接add        // 2、是需要解密的字段,则变成IFNULL(AES_DECRYPT(UNHEX(字段), 密码),字段) AS 字段,再add        // 3、*号则转换成具体的表字段,遍历表字段,是需要解密的字段则转换后add,不是就直接add。add前需要把字段String变成selectItem        // 最后。 sql语句会出现 table b;b.id bid、b.id、id;等情况,根据实际情况判断        selectItemSet.add(selectItem);        }    }

来源地址:https://blog.csdn.net/weixin_43381157/article/details/126764495

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯