要求是每个请求中的XSRF-TOKEN值必须使用存储在服务器上的值进行验证。 以下是安全配置:
protected void configure(HttpSecurity http) throws Exception {
http
.formLogin()
.loginProcessingUrl("/authenticate")
.usernameParameter(...)
.passwordParameter(...)
.loginPage("/").permitAll()
.successHandler(authenticationSuccessHandler)
.failureHandler(authenticationFailureHandler)
.and().logout().permitAll().logoutSuccessHandler(logoutSuccessHandler)
.and().authorizeRequests()
.antMatchers(...).permitAll().anyRequest().authenticated()
.and().csrf().csrfTokenRepository(csrfTokenRepository())
.and().addFilterAfter(csrfHeaderFilter(), CsrfFilter.class)
.exceptionHandling()的AuthenticationEntryPoint(的AuthenticationEntryPoint);
正如我认为它会起作用,在csrfHeaderFilter()
内我可以使用request.getHeader("X-XSRF-TOKEN")
从每个请求中获取标题,然后只将该标记与服务器上的标记进行比较,如此获取:request.getSession(false).getAttribute("...CSRF_TOKEN").getToken()
如果他们不匹配 - 提出错误。但有时request.getHeader("X-XSRF-TOKEN")
即使在用户登录后也会返回null。为什么会发生这种情况以及如何知道哪些请求需要检查?最重要的是可以这样检查吗?