自定义注解,根据注解拦截接口判断请求是否放行

@Documented
@Inherited
@Target({ ElementType.FIELD, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface AclValide {
    String url() default "";
}


@Aspect
@Component
public class AclValideAspect {
    private static Logger logger = LoggerFactory.getLogger(AclValideAspect.class);
    //配置切入点 只对配置AclValide注解的接口进行切入
    @Pointcut("@annotation(com.hanshow.wise.base.privileges.annotation.AclValide)")
    public void controllerAspect() {
        logger.info("ACL注解权限拦截切入点加载");
    }

    //在执行方法前获取AclValide配置的url地址,与redis缓存中的权限集合比对,判断用户是否拥有此权限访问该接口
    @Before("controllerAspect()")
    public void doBefore(JoinPoint joinPoint) {
        logger.info("=====AclValideAspect前置通知开始=====");
        //    访问目标方法参数,有三种方法(实际有四种)
        //    1.joinpoint.getargs():获取带参方法的参数
        //    2.joinpoint.getTarget():.获取他们的目标对象信息
        //    3..joinpoint.getSignature():(signature是信号,标识的意思):获取被增强的方法相关信息
        Object[] args = joinPoint.getArgs();
        if (args == null) {
            //controller请求地址没有参数直接放行
            logger.info("请求接口没有参数,不进行权限校验");
            return;
        }
        //获取请求头参数
        BaseQUERY baseQUERY = null;
        for (int i = 0; i < args.length; i++) {
            Object obj = args[i];
            //请求参数中其中一个是JSONObject
            if (obj instanceof JSONObject) {
                baseQUERY = JSON.parseObject(JSON.toJSONString(obj), BaseQUERY.class);
                if (baseQUERY == null || StringUtil.isEmptyTrim(baseQUERY.getMerchantId()) || StringUtil.isEmptyTrim(baseQUERY.getUserId())) {
                    logger.info("请求头数据不全,merchantId={},userId={},request={},不进行权限校验", baseQUERY.getMerchantId(), baseQUERY.getUserId(), JSON.toJSONString(baseQUERY));
                    return;
                }
                break;
            } else if (obj instanceof BaseQUERY) {
                //请求参数中其中一个是BaseQUERY
                baseQUERY = (BaseQUERY) obj;
                if (StringUtil.isEmptyTrim(baseQUERY.getMerchantId()) || StringUtil.isEmptyTrim(baseQUERY.getUserId())) {
                    logger.info("请求头数据不全,merchantId={},userId={},request={},不进行权限校验", baseQUERY.getMerchantId(), baseQUERY.getUserId(), JSON.toJSONString(baseQUERY));
                    return;
                }
                break;
            }
        }
        //请求接口有参数,但是参数类型没有JSONObject,BaseQUERY两种的任何一种
        if (baseQUERY == null) {
            logger.info("请求接口有参数,但是参数类型没有JSONObject,BaseQUERY两种的任何一种,不进行权限校验");
            return;
        }
        //获取注解方法参数值
        Signature signature = joinPoint.getSignature();
        MethodSignature methodSignature = (MethodSignature) signature;
        Method method = methodSignature.getMethod();
        AclValide aclValideAnnotation = method.getAnnotation(AclValide.class);
        //权限在缓存中的key值
        String resourcePathkey = AspectConstant.PRIVILEGES_PICK_CENTER_SIMPLE + baseQUERY.getMerchantId() + "" + baseQUERY.getUserId();
        Long listLength = RedisUtil.getListLength(resourcePathkey);
        if (listLength == null) {
            logger.info("从缓存获取权限集合长度失败,resourcePathkey={},不进行权限校验", resourcePathkey);
            return;
        }
        List<String> list = RedisUtil.getList(resourcePathkey, 0, listLength);
        if (list == null) {
            logger.info("从缓存获取权限集合失败,resourcePathkey={},不进行权限校验", resourcePathkey);
        } else {
            if (list.contains(aclValideAnnotation.url())) {
                //符合权限放行
            } else {
                throw new WiseException(JSON.toJSONString(BaseDTO.genErrBaseDTO(baseQUERY, BaseError.E10_PERMISSION_DENIED)));
            }
        }
    }

}

 

 

@AclValide(url = "/resource/getTree")
@RequestMapping(value = "/resource/getTree", method = RequestMethod.POST)
@ResponseBody
public Object getTree(HttpServletRequest request, @RequestBody JSONObject jsonObject) {
}
@Component
public class CustomExceptionResolver implements HandlerExceptionResolver {
    private static Logger logger = LoggerFactory.getLogger(CustomExceptionResolver.class);
    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) {
        ModelAndView modelAndView = new ModelAndView();
        response.setStatus(HttpStatus.OK.value()); //设置状态码
        response.setContentType(MediaType.APPLICATION_JSON_VALUE); //设置ContentType
        response.setCharacterEncoding("UTF-8"); //避免乱码
        response.setHeader("Cache-Control", "no-cache, must-revalidate");
        try {
            if (exception instanceof WiseException) {
                WiseException wiseException = (WiseException) exception;
                response.getWriter().write(wiseException.getMessage());
                logger.error("全局异常处理类捕捉到异常:" + wiseException.getMessage());
            } else {
                BaseDTO<Map<String, Object>> objectBaseDTO = BaseDTO.genErrBaseDTO(BaseError.E11_INNER_DATA_ERROR);
                Map<String, Object> returnMap = new HashMap<>();
//                returnMap.put("errMsg", exception.getMessage());
//                returnMap.put("exception", exception);
//                objectBaseDTO.setData(returnMap);
                if(objectBaseDTO.getRequestId()==null){
                    objectBaseDTO.setRequestId(UUIDUtils.genUUID());
                }
                response.getWriter().write(JSONObject.fromObject(objectBaseDTO).toString());
                logger.error("全局异常处理类捕捉到异常:", exception);
            }
        } catch (Exception e) {
            logger.error("全局异常处理失败", e);
        }
        return modelAndView;
    }
}

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值