首页 > 其他分享 >SpringSecurity过滤器-CsrfFilter

SpringSecurity过滤器-CsrfFilter

时间:2023-04-14 22:25:13浏览次数:45  
标签:actualToken CsrfFilter request SpringSecurity csrfToken token csrf 过滤器 response

CsrfFilter是为了防御CSRF攻击的。CSRF攻击请参考松哥手把手教你在 SpringBoot 中防御 CSRF 攻击!so easy!
CsrfFilter的源码在要学就学透彻!Spring Security 中 CSRF 防御源码解析 说的很清楚了。

 
在这里是对LazyCsrfTokenRepository的使用做个总结。

 

CsrfFilter#doFilterInternal

protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
		throws ServletException, IOException {
	request.setAttribute(HttpServletResponse.class.getName(), response);
	CsrfToken csrfToken = this.tokenRepository.loadToken(request);
	boolean missingToken = (csrfToken == null);
	if (missingToken) {
		csrfToken = this.tokenRepository.generateToken(request);
		this.tokenRepository.saveToken(csrfToken, request, response);
	}
	request.setAttribute(CsrfToken.class.getName(), csrfToken);
	request.setAttribute(csrfToken.getParameterName(), csrfToken);
	if (!this.requireCsrfProtectionMatcher.matches(request)) {
		if (this.logger.isTraceEnabled()) {
			this.logger.trace("Did not protect against CSRF since request did not match "
					+ this.requireCsrfProtectionMatcher);
		}
		filterChain.doFilter(request, response);
		return;
	}
	String actualToken = request.getHeader(csrfToken.getHeaderName());
	if (actualToken == null) {
		actualToken = request.getParameter(csrfToken.getParameterName());
	}
	if (!equalsConstantTime(csrfToken.getToken(), actualToken)) {
		this.logger.debug(
				LogMessage.of(() -> "Invalid CSRF token found for " + UrlUtils.buildFullRequestUrl(request)));
		AccessDeniedException exception = (!missingToken) ? new InvalidCsrfTokenException(csrfToken, actualToken)
				: new MissingCsrfTokenException(actualToken);
		this.accessDeniedHandler.handle(request, response, exception);
		return;
	}
	filterChain.doFilter(request, response);
}

if (missingToken) {
		csrfToken = this.tokenRepository.generateToken(request);
		this.tokenRepository.saveToken(csrfToken, request, response);
	}

会生成csrf-token并保存,是get请求时,this.requireCsrfProtectionMatcher.matches(request)判断返回false,就不会走下面的csrf-token验证了。所以没有必要保存csrf-token。LazyCsrfTokenRepository对csrf-token做了代理只在需要保存时才保存。
 

LazyCsrfTokenRepository#saveToken

public void saveToken(CsrfToken token, HttpServletRequest request, HttpServletResponse response) {
	if (token == null) {
		this.delegate.saveToken(token, request, response);
	}
}

只有当token为null时才保存。一般情况下token都不会为null。

 

只有CsrfFilter#doFilterInternal调用到equalsConstantTime(csrfToken.getToken(), actualToken)验证csrf-token时,才去保存csrf-token。

SaveOnAccessCsrfToken#getToken()

public String getToken() {
		saveTokenIfNecessary();
		return this.delegate.getToken();
	}

调用saveTokenIfNecessary去保存csrf-token。

标签:actualToken,CsrfFilter,request,SpringSecurity,csrfToken,token,csrf,过滤器,response
From: https://www.cnblogs.com/shigongp/p/17320087.html

相关文章

  • SpringSecurity
    permitAll() :无条件允许任何形式访问,不管你登录还是没有登录。anonymous() :允许匿名访问,也就是没有登录才可以访问。denyAll() :无条件决绝任何形式的访问。authenticated():只允许已认证的用户访问。fullyAuthenticated() :只允许已经登录或者通过remember-me登录的用户......
  • ansible中过滤器的介绍以及如何自定义过滤器
    一、过滤器介绍二、常用过滤器介绍2.1类型转换2.2数学运算2.3字典转换为列表2.4将字典中的所有key生成一个list2.5总结三、自定义过滤器四、总结之前介绍了关于如何通过shell,python,golang等语言实现自定义模块,可以参考这篇文章:今天主要是介绍下如何实现自定......
  • SpringBoot向web容器注入Servlet,Filter及SpringSecurity注册DelegatingFilterProxy
    从SpringSecurity架构图可知SpringSecurity的过滤器与Web容器的过滤器是通过DelegatingFilterProxy接入的。由DelegatingFilterProxy代理了FilterChainProxy,FilterChainProxy包含了SpringSecurity的过滤器链。 那么DelegatingFilterProxy是怎么创建及如何加入到Web容器中? 看......
  • SpringSecurity源码-构建ProviderManager
    简介在构建WenSecurity执行生命周期AbstractConfiguredSecurityBuilder#doBuild()方法中的init(),会执行到WebSecurityConfigurerAdapter#init(WebSecurityweb)方法,会去创建HttpSecurity。在创建HttpSecurity时调用authenticationManager()构建ProviderManager。 WebSecurityCo......
  • SpringSecurity之WebSecurity和HttpSecurity
    SpringSecurity启动过程中有两个重要的类。分别是WebSecurity和HttpSecurity。 看看WebSecurity的定义:publicfinalclassWebSecurityextendsAbstractConfiguredSecurityBuilder<Filter,WebSecurity>implementsSecurityBuilder<Filter>,ApplicationContextAware,Servl......
  • SpringSecurity源码之WebSecurity构建FilterChainProxy
    主要参考了https://mp.weixin.qq.com/s/D0weIKPto4lcuwl9DQpmvQ。SpringSecurity版本是2.7.9。将SpringBoot和SpringSecurity结合使用,SpringSecurity自动配置类是SecurityAutoConfiguration.class。 @AutoConfiguration@ConditionalOnClass({DefaultAuthenticationEventPubli......
  • 爬虫最后一天,爬取到的数据存到mysql中,爬虫和下载中间件、加代理、cookie、header、se
    爬到的数据存到mysql中classFirstscrapyMySqlPipeline:defopen_spider(self,spider):print('我开了')self.conn=pymysql.connect(user='root',password="",host='127.0.0.1......
  • SpringSecurity体系结构
    我是通过松哥的博客学习SpringSecurity的,地址是http://itboyhub.com/2021/01/26/spring-security-guide/。对SpringSecurity的使用有了初步的认识。并根据松哥的博客跟了源码,但是每个人的思路不一样,看完之后还有点模糊。对其中的一些用法不够深刻。想了下还是根据自己的思路记录下......
  • SpringSecurity实现权限系统设计
    RBAC权限分析RBAC全称为基于角色的权限控制,本段将会从什么是RBAC,模型分类,什么是权限,用户组的使用,实例分析等几个方面阐述RBAC思维导图绘制思维导图如下什么是RBACRBAC全称为用户角色权限控制,通过角色关联用户,角色关联权限,这种方式,间阶的赋予用户的权限,如下图所示对于通常的系统而......
  • Ioc底层核心原理-组件扫描过滤器
              ......