zoukankan      html  css  js  c++  java
  • AOP中使用Aspectj对接口访问权限进行访问控制

     正文前先来一波福利推荐:

     福利一:

    百万年薪架构师视频,该视频可以学到很多东西,是本人花钱买的VIP课程,学习消化了一年,为了支持一下女朋友公众号也方便大家学习,共享给大家。

    福利二:

    毕业答辩以及工作上各种答辩,平时积累了不少精品PPT,现在共享给大家,大大小小加起来有几千套,总有适合你的一款,很多是网上是下载不到。

    获取方式:

    微信关注 精品3分钟 ,id为 jingpin3mins,关注后回复   百万年薪架构师 ,精品收藏PPT  获取云盘链接,谢谢大家支持!

    -----------------------正文开始---------------------------

    切面编程的应用案例比较多,在统一的日志处理,鉴权过程中都会用的AOP原理,本文主要针对对进口的访问权限进行控制为例,说明

    切面编程的使用;

    1、使用Aspectj的方式进行切面编程;

    2、编码环境,spring框架;

    3、延伸的 spring中自定义注解的实现;

    一、自定义注解:注解用来加在权限控制接口上进行注解处理

    //在运行时执行
    @Retention(RetentionPolicy.RUNTIME)
    //注解适用于方法
    @Target({ElementType.METHOD})
    @Documented
    @Inherited
    public @interface Function {    
        //注解的name属性
        String value() default "";
    }

    二、对注解进行切面处理

    @Aspect
    @Component
    public class RoleAccessConfig 
    {
        protected boolean isAccessOK(String functionName)
        {
            //权限查阅
            return false;
        }
        
        protected boolean canAccess(String functionName) 
        {
            if(functionName != null) 
            {
                //总是允许访问
                //针对名称进行权限查阅判断是否有权限
                //
                if( isAccessOK(functionName) )
                {
                    System.out.println(" 具备删除权限 ");
                    return true;
                }else
                {
                    System.out.println(" 不具备删除权限 ");
                    return false;
                }
            }else{
                System.out.println(" 违法访问  ");
                return false ;
            }
            
        }
        
        /**对Controller进行安全和身份校验 */ 
        @Around("within(@org.springframework.stereotype.Controller *) && @annotation (function)")
        public Object functionAccessCheck(final ProceedingJoinPoint pjp , Function function ) throws Throwable 
        {
            if (function != null ) 
            {
                //自动以注解获得注解信息
                String functionName = function.value();
                if( ! canAccess(functionName )) 
                {
                    //获得数字签名
                    Signature ms= pjp.getSignature();
                    //判断是否数据方法签名
                    if (!(ms instanceof MethodSignature))
                    {
                        throw new IllegalArgumentException("该注解只能用于方法");
                    }
                    //转化为方法签名
                    MethodSignature msig = (MethodSignature) ms;
                    
                    throw new RuntimeException ("Can not Access !" + msig.getMethod() );
                }
                
                //继续在切入点处进行操作,也就是有访问权限进入接口处理
                Object o = pjp.proceed() ;
                return o ;
            }else
            {
                Object o = null;
                return o;
            }
        }

    三、在spring配置文件中,开启AOP使用配置

    <aop:aspectj-autoproxy proxy-target-class="true"/>

    只配置这段会报:The prefix "aop" for element "aop:aspectj-autoproxy" is not bound.

    需要添加xsd约束:

    添加这些有关AOP的配置:
     xmlns:aop="http://www.springframework.org/schema/aop"
     和
     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd

    四、在Controller中进行添加注解测试;

    @RequestMapping(value = "/deleteDayCI.do")
        @ResponseBody
        @Function("user")
        public ReturnResult deleteInfo( @RequestParam(value = "id", required = true) String id ) 
        {
        ....
    }

    五、Aspectj用到的jar包:

    aspectjrt-1.8.4.jar

    aspectjweaver-1.8.3.jar

  • 相关阅读:
    Android的数据存储
    Servlet第一天
    JavaScript高级程序设计读书笔记(3)
    Interesting Papers on Face Recognition
    Researchers Study Ear Biometrics
    IIS 发生意外错误 0x8ffe2740
    Father of fractal geometry, Benoit Mandelbrot has passed away
    Computer vision scientist David Mumford wins National Medal of Science
    Pattern Recognition Review Papers
    盒模型bug的解决方法
  • 原文地址:https://www.cnblogs.com/gxyandwmm/p/9722813.html
Copyright © 2011-2022 走看看