一.使用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.