解决CsrfFilter与Rest服务Post方式的矛盾
基于Spring Security+Spring MVC的web应用,为了防止跨站提交攻击,通常会配置csrf,即:
1 <http ...> 2 ... 3 <csrf /> 4 </http>
如果应用中有Post方式访问的Rest服务(参考下面的代码),会很不幸的发现,所有POST方式请求的服务会调用失败。
1 @RequestMapping(value = "/user/create", method = RequestMethod.POST) 2 @ResponseBody 3 public UserInfo createUser(@RequestBody(required = true) UserInfo user, 4 HttpServletRequest request, HttpServletResponse response) 5 throws Exception { 6 ... 7 }
原因在于:启用csrf后,所有http请求都被会CsrfFilter拦截,而CsrfFilter中有一个私有类DefaultRequiresCsrfMatcher
1 private static final class DefaultRequiresCsrfMatcher implements RequestMatcher { 2 private Pattern allowedMethods = Pattern.compile("^(GET|HEAD|TRACE|OPTIONS)$"); 3 4 /* (non-Javadoc) 5 * @see org.springframework.security.web.util.matcher.RequestMatcher#matches(javax.servlet.http.HttpServletRequest) 6 */ 7 public boolean matches(HttpServletRequest request) { 8 return !allowedMethods.matcher(request.getMethod()).matches(); 9 } 10 }
从这段源码可以发现,POST方法被排除在外了,也就是说只有GET|HEAD|TRACE|OPTIONS这4类方法会被放行,其它Method的http请求,都要验证_csrf的token是否正确,而通常post方式调用rest服务时,又没有_csrf的token,所以校验失败。
解决方法:自己弄一个Matcher
1 package com.cnblogs.yjmyzz.utils; 2 3 import java.util.List; 4 import java.util.regex.Pattern; 5 6 import javax.servlet.http.HttpServletRequest; 7 8 import org.springframework.security.web.util.matcher.RequestMatcher; 9 10 public class CsrfSecurityRequestMatcher implements RequestMatcher { 11 private Pattern allowedMethods = Pattern 12 .compile("^(GET|HEAD|TRACE|OPTIONS)$"); 13 14 public boolean matches(HttpServletRequest request) { 15 16 if (execludeUrls != null && execludeUrls.size() > 0) { 17 String servletPath = request.getServletPath(); 18 for (String url : execludeUrls) { 19 if (servletPath.contains(url)) { 20 return false; 21 } 22 } 23 } 24 return !allowedMethods.matcher(request.getMethod()).matches(); 25 } 26 27 /** 28 * 需要排除的url列表 29 */ 30 private List<String> execludeUrls; 31 32 public List<String> getExecludeUrls() { 33 return execludeUrls; 34 } 35 36 public void setExecludeUrls(List<String> execludeUrls) { 37 this.execludeUrls = execludeUrls; 38 } 39 }
这里添加了一个属性execludeUrls,允许人为排除哪些url。
然后在配置文件里,这样修改:
1 <http entry-point-ref="loginEntryPoint" use-expressions="true"> 2 ... 3 <intercept-url pattern="/rest/**" access="permitAll" /> 4 ... 5 <csrf request-matcher-ref="csrfSecurityRequestMatcher"/> 6 </http> 7 8 <beans:bean id="csrfSecurityRequestMatcher" class="com.cnblogs.yjmyzz.utils.CsrfSecurityRequestMatcher"> 9 <beans:property name="execludeUrls"> 10 <beans:list> 11 <beans:value>/rest/</beans:value> 12 </beans:list> 13 </beans:property> 14 </beans:bean>
这里约定所有/rest/开头的都是Rest服务地址,上面的配置就把/rest/排除在csrf验证的范围之外了.
解决CsrfFilter与Rest服务Post方式的矛盾相关推荐
- Spring Security笔记:解决CsrfFilter与Rest服务Post方式的矛盾
基于Spring Security+Spring MVC的web应用,为了防止跨站提交攻击,通常会配置csrf,即: 1 <http ...> 2 ... 3 <csrf /> ...
- 【转载】nginx for windows: 让nginx以服务的方式运行
nginx for windows: 让nginx以服务的方式运行 在windows下安装了nginx, 郁闷是发现它没有以服务方式运行, 也就是说当用户注销后,程序 会终止.因此需要将nginx作为 ...
- [秘技]解决QQ音乐超出服务区域问题
使用大陆音乐APP,通常会发现其他地区无法使用问题,连QQ音乐也不例外,为什么会只有限制大陆能够使用? 听传闻说这些音乐其实他们是有买公开版权,但只有局限在于大陆地区,否则怎么会这么制订这机制呢? 但 ...
- mysql star item 失败_解决CentOS7下MySQL服务启动失败的问题.md
--- title: 解决CentOs7下MySQL服务启动失败的问题 date: 2021-01-06 15:21:31 tags: MySQL --- 老夫前几天才在虚拟机的CentOS安装好My ...
- Nacos注册中心和服务消费方式
哈喽朋友们本次小無分享Nacos注册中心和服务消费方式 前言:本期文章操作性不多,多在于详细的理论说明 还各位看官耐心看完 一,服务治理介绍 目录 一,服务治理介绍 二,nacos简介 nacos实战 ...
- 自动和手动开启无障碍服务的方式
自动开启 条件:系统应用 方式:通过Settings.Secure.putString. 代码如下:最好在开启和关闭前进行判断当前无障碍服务是否已经开启. //自动开启无障碍服务 private fu ...
- JAVA物联所需技术_基于JAVA多线程技术解决物联云端服务雪崩效应的方法与流程...
本发明涉及互联网技术领域,特别涉及一种基于JAVA多线程技术解决物联云端服务雪崩效应的方法. 背景技术: 目前,物联云系统已经作为普遍的智能电视平台出现在我们面前,而细致分析物联云系统我们可以发现,当 ...
- SpringBoot解决跨域问题的六种方式
一.同源策略 同源,就是咱们域名.端口号.ip.采用的协议都相同,那么我们就是同源的 反之就是不同源的!!! 出于浏览器的同源策略限制.同源策略(Sameoriginpolicy)是一种约定,它是浏览 ...
- Spring Cloud Alibaba基础教程:几种服务消费方式(RestTemplate、WebClient、Feign)
热门:Spring Cloud Greenwich.RELEASE 正式发布!一个非常有看头的版本! 通过<Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现&g ...
最新文章
- jQuery和dom的相互转换
- tts代表_Text-to-Speech (TTS) Synthesis语音合成----控制语言合成
- C++编码中减少内存缺陷的方法和工具
- Linux下C编程入门(.h文件,.c文件,以及多文件调用的方式)
- Linux版本_linux版本信息解析
- 神经网络快速搭建之一站式访问
- maven 多仓库和镜像设置
- vivo X27发布日期官宣: 3月19日 三亚见!
- android 内存溢出检查,Android Handler使用导致内存溢出附带LeakCanary排查
- 电脑桌面打开计算机后出现两部分,为什么当打开电脑时,桌面会出现两个我的文档的窗口,是不是中病毒了,怎么处理啊...
- 微信终于良心一回,更新了语音识别功能可识别粤语,广东人有福了
- delphi之鼠标模拟
- java android 读写西门子PLC数据,包含S7协议和Fetch/Write协议,s7支持200smart,300PLC,1200PLC,1500PLC...
- 初学C语言2--C语言项目的基本框架
- <一起JS(基础篇)>4.标识符、字符串、Number、波尔值、Null和Undefined
- 程序员必看:7个接外包私活网站
- oracle blob 24909,imp导入含blob字段的大表时不成功
- LeetCode:Confusing Number II
- java 高效列转行,java 列转行
- SpringBoot缓存@Cacheable