重命名Spring csrf令牌变量

我的应用程序在另一个门户应用程 两者都是在spring实现的,都使用csrf安全性。

我的需要基本上是改变csrf令牌在会话中的命名方式,因此这两个令牌都可以正常工作而不会发生冲突。 到目前为止我尝试创建另一个令牌存储库并尝试更改安全配置类中的参数名称和会话属性名称。

final HttpSessionCsrfTokenRepository tokenRepository = new HttpSessionCsrfTokenRepository(); tokenRepository.setHeaderName("TOOLBIZ-CSRF-TOKEN"); tokenRepository.setParameterName("toolbiz_csfr"); //tokenRepository.setSessionAttributeName("toolbiz_csrf"); 

当我提出请求时,Spring并不太喜欢这个新设置,并且日志会生成以下行:

 Invalid CSRF token found 

我该怎么办? 我错过了什么吗?

这对我有用: –

 @Configuration @Order(SecurityProperties.ACCESS_OVERRIDE_ORDER) public class OptosoftWebfrontSecurity extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests().antMatchers("/assets/**").permitAll() .anyRequest().authenticated().and().formLogin().and() .httpBasic().disable() .addFilterAfter(new CsrfHeaderFilter(), CsrfFilter.class) .csrf().csrfTokenRepository(csrfTokenRepository()); } private CsrfTokenRepository csrfTokenRepository() { HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository(); repository.setHeaderName("X-XSRF-TOKEN"); repository.setParameterName("_csrf"); return repository; } } 

和filter: –

 public class CsrfHeaderFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { CsrfToken csrf = (CsrfToken) request.getAttribute(CsrfToken.class .getName()); if (csrf != null) { Cookie cookie = WebUtils.getCookie(request, "XSRF-TOKEN"); String token = csrf.getToken(); if (cookie == null || token != null && !token.equals(cookie.getValue())) { cookie = new Cookie("XSRF-TOKEN", token); cookie.setPath("/"); response.addCookie(cookie); } } filterChain.doFilter(request, response); } } 

您是否覆盖了WebSecurityConfigurerAdapter #configure方法?

请记住在重命名标题之前删除您已经获得的任何旧cookie。 我有同样的问题,所有设置都很好,但浏览器中的旧cookie导致过滤function基本上没用。