为什么我收到无效的CSRF令牌?

时间:2019-03-22 16:20:20

标签: spring-boot ssl spring-cloud-security

我有一个具有spring-cloud-security的项目。这是用于oauth授权的身份验证服务器。过去效果很好。

我添加了用于配置SSL的spring配置文件

security:
  require-ssl: true
server:
  ssl:
    key-store: dev.p12
    key-store-password: devpass
    keyStoreType: PKCS12
    keyAlias: calc

使用此配置文件,身份验证可以正常工作,但是当我禁用它并通过http登录时,身份验证将失败。

o.s.security.web.csrf.CsrfFilter         : Invalid CSRF token found for http://localhost:8090/login

我该如何解决?

1 个答案:

答案 0 :(得分:0)

您的服务器已启用CSRF@EnableWebSecurity注释将默认启用documentation中所述的CSRF。

  

默认情况下,使用Java配置启用CSRF保护。

有两种方法可以“解决”此问题,即在执行PATCHPOSTPUTDELETE动作时禁用CSRF或submit the CSRF-token

要禁用CSRF,请在Spring Security配置中执行

@EnableWebSecurity
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable();
  }
}

要提交CSRF令牌,必须将其包含在对服务器的请求中(在本示例中为JSP,它发送了POST请求)

<c:url var="logoutUrl" value="/logout"/>
<form action="${logoutUrl}" method="post">
  <input type="submit" value="Log out" />
  <input type="hidden" name="${_csrf.parameterName}"
    value="${_csrf.token}"/>
</form>

所有示例摘自Spring Cross Site Request Forgery (CSRF) documentation

在考虑是否禁用CSRF时,请考虑Spring的建议

  

[...]将CSRF保护用于可能由服务器处理的任何请求   普通用户使用的浏览器。如果您仅创建的服务是   由非浏览器客户端使用,您可能需要禁用CSRF   保护。