3

我有一个带有 spring-cloud-security 的项目。它是用于 oauth 授权的 auth 服务器。它在过去工作得很好。

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

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

我该如何解决?

4

1 回答 1

8

您的服务器启用了CSRF 。注释将@EnableWebSecurity默认启用 CSRF,如文档中所述。

CSRF 保护在 Java 配置中默认启用。

有两种方法可以“修复”这个问题,禁用 CSRF 或在执行、、和操作时提交 CSRF 令牌。PATCHPOSTPUTDELETE

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

@EnableWebSecurity
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

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

要提交 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>

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

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

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

于 2019-03-23T09:37:50.133 回答