一.使用AOP和自定义注解
自定义注解:
@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD})public @interface CustomCheckRole { String[] roles(); //传入多个角色}
编写AOP, 拦截在controller包下注解有@CustomCheckRole的方法, 然后在方法中拦截没有注解中标记了的角色的用户, 抛出没有shiro没有权限的异常.
@Aspect @Component public class AnnotationRoleInterceptor { @Around("execution(* com.fgw.cms.controller..*(..)) && @annotation(customCheckRole)") public Object doInterceptor(ProceedingJoinPoint pjp, CustomCheckRole customCheckRole) throws Throwable { boolean hasRole = false; Subject currentUser = SecurityUtils.getSubject(); if(customCheckRole != null) { String[] roles = customCheckRole.roles(); for(String role : roles) { if(currentUser.hasRole(role)) { hasRole = true; break; } } }else { hasRole = true; } System.out.println("(AOP)拦截到了:"+pjp.getSignature().getName()); if(hasRole) { return pjp.proceed(); }else { throw new AuthorizationException(); } }}
然后根据上一篇配置的全局异常拦截处理器, 会执行对应的方法.
二.使用springmvc拦截器
自定义拦截器,在preHandler中定义自己的逻辑, 和上面的实现差不多,拦截器也是一种AOP.