| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 | package org.jeecg.common.aspect;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.aspectj.lang.reflect.MethodSignature;import org.jeecg.common.api.CommonAPI;import org.jeecg.common.aspect.annotation.PermissionData;import org.jeecg.common.system.util.JeecgDataAutorUtils;import org.jeecg.common.system.util.JwtUtil;import org.jeecg.common.system.vo.SysPermissionDataRuleModel;import org.jeecg.common.system.vo.SysUserCacheInfo;import org.jeecg.common.util.SpringContextUtils;import org.jeecg.common.util.oConvertUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest;import java.lang.reflect.Method;import java.util.List;/** * 数据权限切面处理类 *  当被请求的方法有注解PermissionData时,会在往当前request中写入数据权限信息 * @Date 2019年4月10日 * @Version: 1.0 */@Aspect@Component@Slf4jpublic class PermissionDataAspect {    @Autowired    private CommonAPI commonAPI;    @Pointcut("@annotation(org.jeecg.common.aspect.annotation.PermissionData)")    public void pointCut() {    }    @Around("pointCut()")    public Object arround(ProceedingJoinPoint point) throws  Throwable{        HttpServletRequest request = SpringContextUtils.getHttpServletRequest();        MethodSignature signature = (MethodSignature) point.getSignature();        Method method = signature.getMethod();        PermissionData pd = method.getAnnotation(PermissionData.class);        String component = pd.pageComponent();        String requestMethod = request.getMethod();        String requestPath = request.getRequestURI().substring(request.getContextPath().length());        requestPath = filterUrl(requestPath);        log.debug("拦截请求 >> "+requestPath+";请求类型 >> "+requestMethod);        String username = JwtUtil.getUserNameByToken(request);        //查询数据权限信息        //TODO 微服务情况下也得支持缓存机制        List<SysPermissionDataRuleModel> dataRules = commonAPI.queryPermissionDataRule(component, requestPath, username);        if(dataRules!=null && dataRules.size()>0) {            //临时存储            JeecgDataAutorUtils.installDataSearchConditon(request, dataRules);            //TODO 微服务情况下也得支持缓存机制            SysUserCacheInfo userinfo = commonAPI.getCacheUser(username);            JeecgDataAutorUtils.installUserInfo(request, userinfo);        }        return  point.proceed();    }    private String filterUrl(String requestPath){        String url = "";        if(oConvertUtils.isNotEmpty(requestPath)){            url = requestPath.replace("\\", "/");            url = url.replace("//", "/");            if(url.indexOf("//")>=0){                url = filterUrl(url);            }			/*if(url.startsWith("/")){				url=url.substring(1);			}*/        }        return url;    }    /**     * 获取请求地址     * @param request     * @return     */    private String getJgAuthRequsetPath(HttpServletRequest request) {        String queryString = request.getQueryString();        String requestPath = request.getRequestURI();        if(oConvertUtils.isNotEmpty(queryString)){            requestPath += "?" + queryString;        }        if (requestPath.indexOf("&") > -1) {// 去掉其他参数(保留一个参数) 例如:loginController.do?login            requestPath = requestPath.substring(0, requestPath.indexOf("&"));        }        if(requestPath.indexOf("=")!=-1){            if(requestPath.indexOf(".do")!=-1){                requestPath = requestPath.substring(0,requestPath.indexOf(".do")+3);            }else{                requestPath = requestPath.substring(0,requestPath.indexOf("?"));            }        }        requestPath = requestPath.substring(request.getContextPath().length() + 1);// 去掉项目路径        return filterUrl(requestPath);    }    private boolean moHuContain(List<String> list,String key){        for(String str : list){            if(key.contains(str)){                return true;            }        }        return false;    }}
 |