前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >AOP中使用Aspectj对接口访问权限进行访问控制

AOP中使用Aspectj对接口访问权限进行访问控制

作者头像
小勇DW3
发布2018-10-08 10:28:17
1.5K0
发布2018-10-08 10:28:17
举报
文章被收录于专栏:小勇DW3

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

切面编程的使用;

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

2、编码环境,spring框架;

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

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

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

二、对注解进行切面处理

代码语言:javascript
复制
@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使用配置

代码语言:javascript
复制
<aop:aspectj-autoproxy proxy-target-class="true"/>

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

需要添加xsd约束:

代码语言:javascript
复制
添加这些有关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中进行添加注解测试;

代码语言:javascript
复制
@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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-09-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档