美文网首页
Mybatis-插件数据权限简单使用

Mybatis-插件数据权限简单使用

作者: 尼尔君 | 来源:发表于2021-01-25 16:49 被阅读0次

    注解

    package com.boolib.mybatisplusdemo;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface DataAuth {
    
        String id() default "";
    }
    
    

    具体实现

    package com.boolib.mybatisplusdemo.config;
    
    import com.boolib.mybatisplusdemo.DataAuth;
    import com.fasterxml.jackson.databind.ObjectMapper;
    
    import lombok.SneakyThrows;
    import org.apache.ibatis.cache.CacheKey;
    import org.apache.ibatis.executor.Executor;
    
    import org.apache.ibatis.executor.statement.StatementHandler;
    import org.apache.ibatis.mapping.BoundSql;
    import org.apache.ibatis.mapping.MappedStatement;
    import org.apache.ibatis.plugin.*;
    
    import org.apache.ibatis.reflection.DefaultReflectorFactory;
    import org.apache.ibatis.reflection.MetaObject;
    import org.apache.ibatis.reflection.SystemMetaObject;
    import org.apache.ibatis.session.ResultHandler;
    import org.apache.ibatis.session.RowBounds;
    import org.springframework.stereotype.Component;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    import java.sql.Connection;
    import java.util.Properties;
    
    /**
     * @author: nier
     * @description:
     * @date 2021/1/22 17:16
     */
    @Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class,Integer.class})})
    @Component
    public class MyBatisPluginsDefine implements Interceptor {
        @Override
        public Object intercept(Invocation invocation) throws Throwable {
    
            StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
    
            MetaObject metaObject = MetaObject.forObject(statementHandler, SystemMetaObject.DEFAULT_OBJECT_FACTORY, SystemMetaObject.DEFAULT_OBJECT_WRAPPER_FACTORY, new DefaultReflectorFactory());
    
            MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement");
    
            String id = mappedStatement.getId();
    
            System.out.println(id);
    
            Class<?> classType = Class.forName(mappedStatement.getId().substring(0, mappedStatement.getId().lastIndexOf(".")));
            String mName = mappedStatement.getId().substring(mappedStatement.getId().lastIndexOf(".") + 1, mappedStatement.getId().length());
    
            String userId = "";
            System.out.println(mName);
            for (Method method : classType.getDeclaredMethods()) {
                if (method.isAnnotationPresent(DataAuth.class) && (mName.equals(method.getName()) || mName.equals(method.getName()+"_mpCount") )) {
                    DataAuth permissions = method.getAnnotation(DataAuth.class);
                    userId = permissions.id();
                }
            }
    
    
            System.out.println(userId);
    
            BoundSql boundSql = statementHandler.getBoundSql();
    
            String sql = boundSql.getSql();
    
            System.out.println(sql);
    
    
            String    newSql = sql + " and nickname= '"+userId+"'";
    
    
    
    
            Field field = boundSql.getClass().getDeclaredField("sql");
                             field.setAccessible(true);
                            field.set(boundSql, newSql);
    
    
            return invocation.proceed();
        }
    
        @Override
        public Object plugin(Object target) {
            return  Plugin.wrap(target, this);
        }
    
        @SneakyThrows
        @Override
        public void setProperties(Properties properties) {
            ObjectMapper objectMapper = new ObjectMapper();
            System.out.println(objectMapper.writeValueAsString(properties));
        }
    }
    
    

    相关文章

      网友评论

          本文标题:Mybatis-插件数据权限简单使用

          本文链接:https://www.haomeiwen.com/subject/atrizktx.html