码迷,mamicode.com
首页 > 编程语言 > 详细

SpringBoot aop 注解 数据权限校验

时间:2019-04-15 16:22:23      阅读:1273      评论:0      收藏:0      [点我收藏+]

标签:name   contains   dex   efault   str   sel   alt   auth   one   

注解类:

@Retention(RetentionPolicy.RUNTIME)
public @interface DataAuthValid
{    
    //位置
    public int index() default 0;
    
    //字段   id
    //public String id() default "id";
    
    //字段   id
    public String orgId() default "org_id";
    
    //mapper
    @SuppressWarnings("rawtypes")
    public Class<? extends Mapper> mapper();
}

AOP切面:

@Aspect
@Component
@Order(1)
public class DataAuthAop {
 
    private static String types = "java.lang.String,java.lang.Long,long";
    
    @Before("@annotation(dataAuth)")
    public void beforeMethod(JoinPoint point,DataAuthValid dataAuth) throws Exception {
        
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        Map<String, Object> payloadMap = (Map<String, Object>) request.getAttribute("payloadMap");
        Long companyid = Long.parseLong(payloadMap.get("companyid")+"");
        if(companyid != 1) {
            Object[] args = point.getArgs();
            Object obj = args[dataAuth.index()];
            String ids = null;
            String typeName = obj.getClass().getTypeName();
            if(types.contains(typeName)) {
                ids = obj + "";
            }else {
                Field[] fields = obj.getClass().getDeclaredFields();
                for (Field f : fields) {
                    f.setAccessible(true);
                    if("id".equals(f.getName())) {
                        Long id = (Long) f.get(obj);
                        ids = id + "";
                    }
                }
            }
            String[] idArr = ids.split(",");
            for (String id : idArr) {
                Class cla = dataAuth.mapper();
                Mapper mapper = (Mapper) SpringBeanFactoryUtils.getApplicationContext().getBean(cla);
                Object object = mapper.selectByPrimaryKey(Long.valueOf(id));
                Field field = obj.getClass().getDeclaredField(dataAuth.orgId());
                field.setAccessible(true);
                Long orgId = (Long)field.get(obj);
                if(!companyid.equals(orgId)) {
                    throw new RuntimeException();
                }
            }
        }
    }
}

使用:

技术图片

SpringBoot aop 注解 数据权限校验

标签:name   contains   dex   efault   str   sel   alt   auth   one   

原文地址:https://www.cnblogs.com/shuaixianbohou/p/10711042.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!