`
- 浏览:
140611 次
- 性别:
- 来自:
南京
-
利用Spring HandlerInterceptor和RequestMapping注解进行权限访问控制
注意:本文仅适用于以@RequestMapping注解为基础的Spring MVC项目,并且权限控制粒度和RequestMapping标注的方法一一对应的情况
最近一直在思考权限拦截系统如何实现,在Restful的时代,我们认为一个url就是一个资源,而对于Spring来说,每个@RequestMapping标注的方法应该就对应了一个操作行为。如何配置用户权限信息让用户在到达每个操作行为前就判断用户是否有进行当前操作的权限就是需要解决的问题。
最开始是将url+method分别写入数据库作为一个operation,然后给角色分配这些operation,用户登陆的时候只需要加载自己所具有的operations,登陆的时候进行判断url是否matching就可以了。目前也是这样做的。
更多思考:
1.我们的url,method,甚至是parameter和header定义都可以写到@RequestMapping注解内,我们有必要到数据库重复一遍吗?
2.url包含通配符或者PathVariable的时候,哪怕使用AntPathMatcher也可能出现一条url映射出多个urlPattern的情况,选择最优匹配能不能和Spring的结果一致?而Spring MVC总是能为我们的请求找到对应的方法,我们能不能交给Spring去做好这件事?
我查看了Spring的源码,也进行了一些断点测试,最终发现,在HandlerInterceptorAdapter的preHandle方法的handler参数中(需要强制转换为HandlerMethod对象),已经包含了Spring为我们查找到的method对象。
就此我产生了一个灵感,method对象是可以获得所有注解的,我们可以自己实现一个注解类来标识每一个RequestMapping,也就是赋予ID,然后在数据库中将这些ID和角色进行关联,只需要在preHandle方法中取得这个id,然后验证当前用户是否具有这个id就能够判断用户是否具有权限,并依此决定是否放行!
现在的问题就转换为如何同步数据库和应用程序中的这些ID,Spring已经为我们提供了一个解决方案,就是BeanPostProcessor接口。
在Spring实例化每个controller的时候进行介入读取所有的ID并缓存,在系统完全启动后触发ApplicationListener中的ContextRefreshEvent事件,这时我们可以和数据库中的id进行比对,删除已经不存在的关联,并提醒管理员关联新增的operation id。
考虑到修改程序才可能会修改id配置,而这个id配置对系统访问的操作也没有影响,所以可以规定id一旦被设置就不能被修改,只能删除或新增。而这个频率也不会很高,因此依然在可以接受的范围内。
ps:这个思路还可以实现url白名单、黑名单哦,也欢迎提供别的应用思路。
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
12. **拦截器**: `HandlerInterceptor`接口可以实现预处理和后处理逻辑,比如权限验证、日志记录等。使用`@Configuration`和`@EnableWebMvc`注解的类中,可以通过`addInterceptors`方法添加拦截器。 以上只是Spring...
在这个注解实例中,我们将深入探讨Spring MVC中的核心注解以及如何利用它们实现对数据库表的增删改查(CRUD)操作。拦截器是Spring MVC中的另一个重要概念,它允许我们在请求处理前后执行自定义逻辑。 首先,让我们...
在本项目实例中,我们探讨的是如何使用Spring MVC框架结合注解进行开发,以及如何实现对数据库表的CRUD(创建、读取、更新、删除)操作。Spring MVC是Spring框架的一部分,它专注于Web应用程序的模型-视图-控制器...
@RequestMapping注解是Spring MVC中用于映射HTTP请求到控制器方法的关键工具。它可以应用于类或方法级别,以指定处理特定URL的请求。例如: ```java @Controller @RequestMapping("/users") public class ...
总的来说,"Mastering Spring MVC 4(2015.09)源码"提供了深入学习Spring MVC的机会,你可以通过阅读和分析源码来了解如何配置DispatcherServlet、怎样编写控制器、如何进行数据绑定与验证,以及如何利用拦截器等特性...
本文将深入探讨如何将这三个框架进行整合,并且利用全注解的方式,以及在Oracle数据库中使用存储过程和拦截器。 **Spring MVC** Spring MVC是Spring框架的一个模块,专门用于构建Web应用程序。它提供了一种优雅的...
Spring 3.0.x增强了对RESTful风格的Web服务支持,通过@RequestMapping注解的pathVariable和method属性,可以方便地处理HTTP方法和路径变量。 12. **Spring Test模块**: Spring Test模块提供了JUnit集成,使得...
Spring 3.0版本引入了多种增强的功能,使得控制器的编写更加灵活和高效。以下是对"spring控制器参数代码"及相关知识的详细讲解。 1. **@Controller注解** Spring MVC中的控制器类通常会使用`@Controller`注解来...
- Spring MVC框架遵循MVC设计模式,将Web层分为模型、视图和控制器,以实现Web应用的各层职责明确、易于维护和扩展。 2. SpringMVC入门 - SpringMVC入门是学习Spring MVC的起点,介绍了如何搭建基本的Spring MVC...
通过Spring MVC的配置和使用,我们可以看到其强大的灵活性和控制能力,这些都是通过其大量的配置选项和注解来实现的。无论是参数绑定、返回JSON报文还是增加拦截器,Spring MVC都能提供一种清晰且有效的解决方案。
通过实现HandlerInterceptor接口,创建拦截器来执行预处理和后处理操作,例如日志记录、权限检查等。 六、全局异常处理: 通过定义@ControllerAdvice和@ExceptionHandler注解,可以实现全局异常处理,捕获并处理...
Controller类使用@Controller和@RequestMapping注解来定义处理HTTP请求的方法。通过方法参数,可以接收请求参数、路径变量和请求头等信息。@RequestParam用于获取URL查询参数,@PathVariable用于处理RESTful风格的...
在Spring 2.5 MVC中,还可以利用拦截器(HandlerInterceptor)对请求进行预处理和后处理,实现如权限检查、日志记录等功能。拦截器通过实现HandlerInterceptor接口并配置在DispatcherServlet中,可以在请求处理前后...
10. **RESTful支持**:通过@RequestMapping注解的produces和consumes属性,Spring Web MVC能够轻松实现RESTful服务,支持HTTP动词如GET、POST、PUT、DELETE等。 在实际项目中,Spring Web MVC 4.1.2与其他Spring...
- **使用 HandlerInterceptor 拦截请求**:这些拦截器可以在请求到达控制器之前或之后执行某些操作,比如权限验证或记录日志。 #### 视图解析 (View Resolution) - **使用 ViewResolver 接口解析视图**:视图解析器...
它提供了模型、视图和控制器的分离,使开发者可以独立地处理各个部分。此外,Spring MVC还支持多种视图技术,如JSP、Thymeleaf等,以及数据绑定和验证功能。 2. **MVC组件** - **Model**:模型对象持有应用程序的...
12. **拦截器**:Spring MVC中的拦截器(HandlerInterceptor)可以在请求被处理之前或之后执行自定义逻辑,例如权限检查、日志记录等。 除了Spring Web MVC的核心jar包外,"相关jar包"可能包括以下依赖: - **...
Spring MVC 通过分离模型、视图和控制器组件来简化 Web 开发。Spring MVC 4.2.4.RELEASE 是 Spring MVC 框架的一个版本号,中文文档对这个版本进行了详细的介绍和说明。 Spring MVC 框架简介部分讲解了该框架的基本...
- **SimpleUrlHandlerMapping**:通过配置文件显式指定URL和控制器之间的映射关系。 - **AnnotationDrivenHandlerMapping**:根据控制器类上的注解(如`@RequestMapping`)自动创建映射。 这些映射机制使得Spring ...
2. 支持RESTful风格:可以通过@RequestMapping注解实现RESTful API设计。 3. 数据绑定和验证:自动将请求参数绑定到Controller方法的参数,支持JSR-303/JSR-349验证。 4. 异常处理:可以通过@ControllerAdvice和@...