MongoDb多租户拦截器

yuyu888 于 2023-03-31 发布

前言

承接上一章: Mybatis多租户解决方案; 我们的数据也存在mongodb中, 所以 mongodb也需要一套机制来满足!

设计思路

我们的查询一般都是:mongoTemplate.find(query, LogEntity.class); 其中query是条件, 我们只需在查询前改写 query就行了;所以我们需要监听 mongoTemplate 这个类中的方法, 只要参数中有query 我们就按需要添加租户id;AOP就可以很好的满足这一点

具体实现

话不多说,直接上代码:


import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Component;
import static org.springframework.data.mongodb.core.query.Criteria.where;

@Aspect
@Component
@Slf4j
public class MongoTemplateAspect {


    @Pointcut("within(org.springframework.data.mongodb.core.MongoTemplate)")
    public void mongoPointCut() {

    }

    @Around("mongoPointCut()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        log.info("========66666666777========");
        //获取相关参数
        Object[] arguments = joinPoint.getArgs();
        for (Object arg : arguments) {
            if (arg instanceof Query){
                arg = rebuildQuery(arg);

            }
            break;
        }
        Object proceed = joinPoint.proceed(arguments);
        return proceed;
    }

    private Object rebuildQuery(Object arg) {
        Query query = (Query)arg;
        log.info(String.valueOf(query.getQueryObject()));
        if(query.getQueryObject().containsKey("uid")){
            log.info("666");
        }else{
            query.addCriteria(where("uid").is(666));
//            query.addCriteria(Criteria.where("uid").is("666"));
            log.info("7777");
        }
        log.info(String.valueOf(query.getQueryObject()));
        return query;
    }
}

实现起来非常简单, 这里我写死了 新增的 query条件:query.addCriteria(where(“uid”).is(666)); 实际上实施中可以增加一个manger 来做管理, 具体可以参考:Mybatis多租户解决方案

本章只讨论通过aop的基础实现, 实际还可以监听指定方法!