`
- 浏览:
138738 次
- 性别:
- 来自:
南京
-
利用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
相关推荐
springboot spring aop 拦截器 注解方式实现脱敏(涉及到:pom.xml -->application.properties --->启动类-->拦截器)
NULL 博文链接:https://412887952-qq-com.iteye.com/blog/2292476
详细描述见https://my.oschina.net/u/2245781/blog/1595860
1.25 Spring Boot 拦截器HandlerInterceptor 1.26 Spring Boot启动加载数据CommandLineRunner 1.27 Spring Boot环境变量读取和属性对象的绑定 1.28 Spring Boot使用自定义的properties 1.29 改变自动扫描的包 1.30 ...
11.2. 利用JDBC核心类控制JDBC的基本操作和错误处理 11.2.1. JdbcTemplate类 11.2.2. NamedParameterJdbcTemplate类 11.2.3. SimpleJdbcTemplate类 11.2.4. DataSource接口 11.2.5. SQLExceptionTranslator接口...
11.2. 利用JDBC核心类控制JDBC的基本操作和错误处理 11.2.1. JdbcTemplate类 11.2.2. NamedParameterJdbcTemplate类 11.2.3. SimpleJdbcTemplate类 11.2.4. DataSource接口 11.2.5. SQLExceptionTranslator接口...
17. 使用Spring进行远程访问与Web服务 17.1. 简介 17.2. 使用RMI暴露服务 17.2.1. 使用 RmiServiceExporter 暴露服务 17.2.2. 在客户端链接服务 17.3. 使用Hessian或者Burlap通过HTTP远程调用服务 17.3.1. 为...
6.8.1. 在Spring中使用AspectJ来为domain object进行依赖注入 6.8.1.1. @Configurable object的单元测试 6.8.1.2. 多application context情况下的处理 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来...
主要介绍了浅谈SpringMVC HandlerInterceptor诡异问题排查,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
17. 使用Spring进行远程访问与Web服务 17.1. 简介 17.2. 使用RMI暴露服务 17.2.1. 使用 RmiServiceExporter 暴露服务 17.2.2. 在客户端链接服务 17.3. 使用Hessian或者Burlap通过HTTP远程调用服务 17.3.1. 为...
spring aop切面拦截指定类和方法实现流程日志跟踪 一般情况下,在不侵入业务代码的情况下,需要做流程日志跟踪是比较合理的 采用springaop切面思想
常用拦截 拦截器HandlerInterceptor 拦截器MethodInterceptor 添加依赖 创建启动类 创建拦截器类 创建控制器 监控control请求耗时,提高性能
主要介绍了Spring拦截器HandlerInterceptor接口代码解析,具有一定借鉴价值,需要的朋友可以参考下
spring mvc 拦截器获取请求数据信息 解压之后放到项目中 直接运行就可以了 (将流多次运用)
多数据源调整和修改,支持数据源的切换等功能
主要介绍了springMVC拦截器HandlerInterceptor用法代码示例,具有一定借鉴价值,需要的朋友可以参考下
主要介绍了利用spring的拦截器自定义缓存的实现实例代码,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
开源地址系统要求基于 spring-boot 开发(spring-boot1.x, spring-boot2.x 均可)需要使用 redis工作流程kk-anti-reptile 使用 对请求进行过滤,通过 spring-boot 的扩展点机制,实例化一个Spring HandlerInterceptor ...
1、 首先用户发送请求,前端控制器DispatcherServlet收到请求后自己不进行处理,而是委托给其他的解析器进行处理,前端控制器作为统一访问点,进行全局的流程控制; 2、 DispatcherServlet把请求转交给...
就像我们拥有Struts2拦截器一样,我们可以在Spring中创建自己的拦截器,方法是实现org.springframework.web.servlet.HandlerInterceptor接口或重写抽象类org.springframework.web.servlet.handler....