背景:用户有对应菜单的权限,但是如果用户知道了其他菜单的URL,直接访问URL的话,就可以访问用户本来并不
具有权限的菜单,所以为了避免这种越权访问现象,提出根据URL鉴权的功能。新建自定义注解
1 | @Target({ElementType.METHOD}) |
实现自定义注解信息收集
新建自定义类MyListenerProcessor,实现BeanPostProcessor接口,重写postProcessAfterInitialization方法。此方法会在所有bean加载完成后调成,可以在这里通过反射获取所有类中所有方法,在获取方法上的自定义注解信息,保存在一个全局变量 StoreMenuUrlMap 中
1 | @Component |
备注: 在通过ReflectionUtils.getAllDeclaredMethods()获取所有方法是,如果注解的类在被代理的包中时,需要AopUtils.getTargetClass()通过代理类获取实际类,才能获取到所有方法。
监听器将自定义注解信息入库
新建InitMenuAndUrlListener,在项目启动时,将全局变量StoreMenuUrlMap中的数据持久化到数据库指定表中。
1 | public class InitMenuAndUrlListener implements ServletContextListener { |
拦截器完成URL鉴权功能
通过拦截器将所有请求进行拦截,通过项目启动时生成的表完成URL鉴权功能。