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

slo*_*lon 3 ssl spring-boot spring-cloud-security

我有一个带有 spring-cloud-security 的项目。它是用于 oauth 授权的 auth 服务器。过去运行良好。

我添加了带有配置的 ssl 支持的 spring 配置文件:

security:
  require-ssl: true
server:
  ssl:
    key-store: dev.p12
    key-store-password: devpass
    keyStoreType: PKCS12
    keyAlias: calc
Run Code Online (Sandbox Code Playgroud)

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

o.s.security.web.csrf.CsrfFilter         : Invalid CSRF token found for http://localhost:8090/login
Run Code Online (Sandbox Code Playgroud)

我该如何解决?

Mis*_*orp 6

您的服务器启用了CSRF。在@EnableWebSecurity为中注明注释将默认启用CSRF文档

使用 Java 配置默认启用 CSRF 保护。

有两种方法来“解决”这个,要么禁用CSRF或提交CSRF令牌做的时候PATCHPOSTPUT,和DELETE行动。

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

@EnableWebSecurity
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable();
  }
}
Run Code Online (Sandbox Code Playgroud)

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

<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>
Run Code Online (Sandbox Code Playgroud)

取自 Spring Cross Site Request Forgery (CSRF) 文档的所有示例

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

[...] 对普通用户可以由浏览器处理的任何请求使用 CSRF 保护。如果您仅创建供非浏览器客户端使用的服务,您可能希望禁用 CSRF 保护。