Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring CSRF保护不适用于预验证筛选器_Spring_Spring Mvc_Spring Security_Csrf - Fatal编程技术网

Spring CSRF保护不适用于预验证筛选器

Spring CSRF保护不适用于预验证筛选器,spring,spring-mvc,spring-security,csrf,Spring,Spring Mvc,Spring Security,Csrf,我有以下设置: 使用共享RESTAPI的Android应用程序和web应用程序 使用令牌进行身份验证 令牌是使用特定的REST服务生成的 预身份验证筛选器从请求中获取令牌并对用户进行身份验证(增强SecurityContext) 我正在使用启用CSRF的SpringSecurity4.0 以下场景成功: Android应用程序通过调用/rest/login进行身份验证 此请求具有权限,使用CsrfFilter中的请求匹配器将其忽略 Android应用程序调用/rest/some/sec

我有以下设置:

  • 使用共享RESTAPI的Android应用程序和web应用程序
  • 使用令牌进行身份验证
  • 令牌是使用特定的REST服务生成的
  • 预身份验证筛选器从请求中获取令牌并对用户进行身份验证(增强SecurityContext)
我正在使用启用CSRF的SpringSecurity4.0

以下场景成功:

  • Android应用程序通过调用/rest/login进行身份验证
    • 此请求具有权限,使用CsrfFilter中的请求匹配器将其忽略
  • Android应用程序调用/rest/some/secured/api
    • 此请求具有hasRole(“..”)保护,需要有效的CSRF令牌
以下场景失败:

  • Android应用程序重新启动并通过调用/rest/token检查他的令牌是否仍然有效
    • 此请求具有权限保护,并使用相同的请求匹配器被忽略
    • 预身份验证过滤器增加了SecurityContext,因此SpringRestController能够检查处理程序中的主体
  • 由于CSRF令牌无效,以下任何对安全API的请求都会失败
我看到CsrfAuthenticationStrategy在调用/rest/token之后删除了失败场景中的CSRF令牌

有人知道为什么第二种情况会失败吗

我已经检查过了,但是我的预认证过滤器已经位于CSRF过滤器之前


非常感谢

它是如何失败的?错误消息是什么?@RobWinch
org.springframework.security.web.csrf.CsrfFilter:http://***/rest/some/securied/api的csrf令牌无效。我还在CsrfFilter之后使用我自己的筛选器将csrf令牌放入XSRF-token cookie中,这样我就可以使用AngularJS的即时支持。我不确定我是否理解这个流程,但根据错误,您可能已注销、登录或会话超时。如果是这种情况,您将需要获取一个新的CSRF令牌。确实正在创建一个新会话,因为当应用程序重新启动时,没有JSSessionID cookie。但是,即使我们保留cookie并在应用程序重新启动时重用它们,从而重用相同的http会话,也会发生相同的错误。它是如何失败的?错误消息是什么?@RobWinch
org.springframework.security.web.csrf.CsrfFilter:http://***/rest/some/securied/api的csrf令牌无效。我还在CsrfFilter之后使用我自己的筛选器将csrf令牌放入XSRF-token cookie中,这样我就可以使用AngularJS的即时支持。我不确定我是否理解这个流程,但根据错误,您可能已注销、登录或会话超时。如果是这种情况,您将需要获取一个新的CSRF令牌。确实正在创建一个新会话,因为当应用程序重新启动时,没有JSSessionID cookie。但是,即使我们保留cookie并在应用程序重新启动时重用它们,从而重用相同的http会话,也会发生相同的错误。