您的位置:首页 > 编程语言 > Java开发

使用spring的aop进行权限拦截

2015-08-04 18:05 302 查看
一个SSI的项目(springmvc+mybatis),需要加上权限验证(非数据权限),考虑使用aop来实现。大致思路是使用自定义注解,在需要权限控制的方法前(controller层)使用注解定义方法所需的权限,然后使用AOP拦截访问的方法,在执行目标对象前通过反射取得目标对象所需的权限,然后从当前session中取得登陆用户,遍历用户所拥有的权限,如果有权限则继续执行目标对象,如果没有权限则跳转到错误提示页面。

1、如下定义annotation:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)  
public @interface Permission {
	String value() default "yes";
	String system();
	String module();
	int type() default 1;
	
}
2、定义切面类验证权限:
//声明该类为一个切面

@Aspect

@Component

public class MyInterceptor {

//切入点要拦截的类

@Pointcut("execution (* com.ifeng.iis.controller..*.*(..))")

private void anyMethod(){} //声明一个切入点,切入点的名称其实是一个方法





//环绕通知(特别适合做权限系统)

@Around("anyMethod()")

public Object doBasicProfiling(ProceedingJoinPoint jp) throws Throwable{

System.out.println("环绕通知进入方法");





Signature signature = jp.getSignature();

MethodSignature methodSignature = (MethodSignature)signature;

Method targetMethod = methodSignature.getMethod();

//对于有permission注解的方法进行权限验证

boolean b = targetMethod.isAnnotationPresent(Permission.class);

if (b) {//带有权限注解的方法

Permission perm = targetMethod.getAnnotation(Permission.class);

String value = perm.value();

if (value.equals("yes")) { //权限验证打开

//获取session信息

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();

ServletWebRequest servletWebRequest=new ServletWebRequest(request);

HttpServletResponse response=servletWebRequest.getResponse();

User user = (User) request.getSession().getAttribute("sessionUser");

//从权限注解中获取信息

String system = perm.system();

String module = perm.module();

....//验证

}

} else {

Object object=jp.proceed();

System.out.println("环绕通知退出方法");

return object;

}

}

}

注:通过反射,可以获得切入点方法上是否有权限注解,对于有权限注解的方法,需要进行权限验证。

3、配置aop,拦截controller中所有的方法。(http://blog.csdn.net/liuxiao723846/article/details/47279221)

参考://zhanghua.1199.blog.163.com/blog/static/464498072011111393634448/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: