Springboot自定义注解

作者: 清风_gary_明月 | 来源:发表于2019-08-18 11:18 被阅读5次

      需求:通过Springboot自定义注解的方式来实现权限和日志模块的引用(这里侧重应用层面作用)。


    1、工程描述


    a1.png

      说明:InAuth.java为要定义的注解接口,AuthAspect.java为切面实现,UserAuthEnum.java为用户权限枚举,AuthServiceImpl.java为业务实现,Auth.java为对外提供接口(控制层)。


    2、代码步骤


    第一:定义注解接口

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface InAuth {
        UserAuthEnum[] limit() default {};
    }
    

    第二:定义切面

    /*****************************************
     ***说明:这里重点介绍权限,忽略登录会话等***
     *****************************************/
    @Aspect
    @Component
    @Configuration
    public class AuthAspect {
        @Around("@annotation(inAuth)")
        public Object around(ProceedingJoinPoint point, InAuth inAuth) throws Throwable {
            UserAuthEnum[] ifAuth = inAuth.limit();// 获取接口权限
            if (ifAuth == null || ifAuth.length == 0) {
                return point.proceed(); // 该接口不需要权限
            }
            int[] limit = {10,20,100};  //将ifAuth转成权限码
            // 1、获取用户的会话Token,我们是放在ThreadLocal中的
            // 2、根据Token会话中取出用户的权限列表,会话存在redis中
            // 3、上面两步略,用户权限直接用数据模拟,我们用户权限返回的是Set
            // 4、可以加一些逻辑判断,返回一些异常情况
            Set<Integer> userSet = new HashSet<Integer>();
            userSet.add(1000) ;
            for (int lt : limit) {
                if (userSet.contains(lt)) {
                    return point.proceed();
                }
            }
            return "no acess auth!";
        }
    }
    

    第三:定义权限的枚举类

    public enum UserAuthEnum {
        A_ADMIN(10), // 管理员权限
        A_READ(20), // 只读权限
        A_UPLOAD(30), // 上报权限
        A_CHARTS(40), // 报表权限
        A_LIST(50);// 名单管理权限
        private int code;
        private UserAuthEnum(int code) {
            this.code = code;
        }
        public int getCode() {
            return this.code;
        }
    }
    

    第四:定义业务接口(引用自定的注解)

    @Service("authService")
    public class AuthServiceImpl implements AuthService {
        @Override
        @InAuth(limit={UserAuthEnum.A_CHARTS,UserAuthEnum.A_ADMIN}) //要么有管理员权限,要么有charts权限可以访问
        public String testAuth() {
            return "---auth test---";
        }
    }
    

    第五:定义切面

    public interface EacProxy {
         public String query();  //可以返回复杂对象类型
    }
    

    第六:定义测试接口

    @RestController
    public class Auth {
        @Autowired
        private AuthService authService ;
    
        @RequestMapping("/auth")
        public String sayHello() throws Exception {
            return authService.testAuth() ;
        }
    }
    

      注解让代码代码世界更简洁、更简单了,但也存在缺点,让异常定位更麻烦,让理解spring执行原理更复杂(感觉从spring原理慢慢修理才是正道)。


    3、打包下载


    链接:https://pan.baidu.com/s/15upCKAvQerQr7zpuJNAy9Q 
    提取码:i9dm 
    

      若链接莫名失效,可以留言联系,也可以按照上述的方式自行配置。


    更多可关注

    相关文章

      网友评论

        本文标题:Springboot自定义注解

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