mybatisplus添加数据权限过滤(自定义拦截器,sql拦截)

    import com.baomidou.mybatisplus.core.toolkit.PluginUtils;
    import com.baomidou.mybatisplus.extension.handlers.AbstractSqlParserHandler;
    import lombok.AllArgsConstructor;
    import lombok.extern.slf4j.Slf4j;
    import org.apache.ibatis.executor.statement.StatementHandler;
    import org.apache.ibatis.mapping.BoundSql;
    import org.apache.ibatis.mapping.MappedStatement;
    import org.apache.ibatis.mapping.SqlCommandType;
    import org.apache.ibatis.plugin.*;
    import org.apache.ibatis.reflection.MetaObject;
    import org.apache.ibatis.reflection.SystemMetaObject;
    import org.springframework.stereotype.Component;

    import javax.sql.DataSource;
    import java.sql.Connection;
    import java.util.Properties;

    @Slf4j
    @AllArgsConstructor
    @Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})})
    @Component
    public class DataScopeInterceptor  extends AbstractSqlParserHandler implements Interceptor {
        private DataSource dataSource;

        @Override
        public Object intercept(Invocation invocation) throws Throwable {
            StatementHandler statementHandler = PluginUtils.realTarget(invocation.getTarget());
            MetaObject metaObject = SystemMetaObject.forObject(statementHandler);
            this.sqlParser(metaObject);
            // 先判断是不是SELECT操作 不是直接过滤
            MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement");
            if (!SqlCommandType.SELECT.equals(mappedStatement.getSqlCommandType())) {
                return invocation.proceed();
            }
            BoundSql boundSql = (BoundSql) metaObject.getValue("delegate.boundSql");
            // 执行的SQL语句
            String originalSql = boundSql.getSql();
            // SQL语句的参数
            Object parameterObject = boundSql.getParameterObject();

                originalSql = "select * from (" + originalSql + ") temp_data_scope where temp_data_scope." + 1 + " in (" + 2 + ")";
                metaObject.setValue("delegate.boundSql.sql", originalSql);
                return invocation.proceed();
        }

        /**
         * 生成拦截对象的代理
         *
         * @param target 目标对象
         * @return 代理对象
         */
        @Override
        public Object plugin(Object target) {
            if (target instanceof StatementHandler) {
                return Plugin.wrap(target, this);
            }
            return target;
        }

        /**
         * mybatis配置的属性
         *
         * @param properties mybatis配置的属性
         */
        @Override
        public void setProperties(Properties properties) {

        }

        /**
         * 查找参数是否包括DataScope对象
         *
         * @param parameterObj 参数列表
         * @return DataScope
         */
    //    private DataScope findDataScopeObject(Object parameterObj) {
    //        if (parameterObj instanceof DataScope) {
    //            return (DataScope) parameterObj;
    //        } else if (parameterObj instanceof Map) {
    //            for (Object val : ((Map<?, ?>) parameterObj).values()) {
    //                if (val instanceof DataScope) {
    //                    return (DataScope) val;
    //                }
    //            }
    //        }
    //        return null;
    //    }
    }

 

以下代码添加至mybatisplusconfig

 

    /**
     * 数据权限插件
     *
     * @return DataScopeInterceptor
     */
    @Bean
    @ConditionalOnMissingBean
    public DataScopeInterceptor dataScopeInterceptor(DataSource dataSource) {
        return new DataScopeInterceptor(dataSource);
    }

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MybatisPlus是Mybatis的增强版本,它提供了更多的功能和便利的操作。自定义拦截器MybatisPlus中的一个重要特性,可以在SQL执行前后进行一些自定义的操作。 下面是一个示例,展示如何在MybatisPlus中自定义拦截器: 1. 创建一个自定义拦截器类,例如`MyQueryInterceptor`,并实现`Interceptor`接口。 ```java public class MyQueryInterceptor implements Interceptor { @Override public Object intercept(Invocation invocation) throws Throwable { // 在SQL执行前的操作 // ... // 执行原始的SQL语句 Object result = invocation.proceed(); // 在SQL执行后的操作 // ... return result; } } ``` 2. 在MybatisPlus的配置文件中配置自定义拦截器。 ```java @Configuration public class MybatisPlusConfig { @Bean public MyQueryInterceptor myQueryInterceptor() { return new MyQueryInterceptor(); } @Bean public MybatisPlusInterceptor mybatisPlusInterceptor(MyQueryInterceptor myQueryInterceptor) { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(myQueryInterceptor); return interceptor; } } ``` 3. 使用自定义拦截器。 ```java @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { @Autowired private UserMapper userMapper; @Override public List<User> getUserList(String keyword) { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.like("username", keyword); return userMapper.selectList(queryWrapper); } } ``` 以上示例展示了如何在MybatisPlus中自定义拦截器,并在模糊查询时进行特殊字符的转义处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值