使用spring的aop进行权限拦截
2015-08-04 18:05
302 查看
一个SSI的项目(springmvc+mybatis),需要加上权限验证(非数据权限),考虑使用aop来实现。大致思路是使用自定义注解,在需要权限控制的方法前(controller层)使用注解定义方法所需的权限,然后使用AOP拦截访问的方法,在执行目标对象前通过反射取得目标对象所需的权限,然后从当前session中取得登陆用户,遍历用户所拥有的权限,如果有权限则继续执行目标对象,如果没有权限则跳转到错误提示页面。
1、如下定义annotation:
//声明该类为一个切面
@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/
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/
相关文章推荐
- Maven+SpringMVC+MyBatis 上传图片
- 【Java并发编程实战】—–synchronized
- java字符串的hashCode
- springmvc运行机制
- Java基础---折半查找和进制转换
- 【转帖】ECLIPSE-JEE-LUNA-SR2官方汉化教程
- Java中正则表达式的使用
- spring线程池ThreadPoolExecutor配置
- 代理模式与Spring
- Java里到底是引用传递还是值传递
- Spring mvc 用FreeMarker模板化
- new Thread的弊端及Java四种线程池的使用
- Java线程池使用说明
- Java中this关键字的几种用法
- maven中使用spring的test包结合junit4进行测试。
- MyBatis Spring整合配置映射接口类与映射xml文件
- Java并发编程之Callable,Future,FutureTask
- Java一处编译到处运行的简单原理
- springMVC接收对象参数
- Java并发编程:深入剖析ThreadLocal