javascript – AngularJS XSRF策略不支持cookie路径

我有三个
Spring Boot应用程序在不同路径的同一台服务器上运行.所有这三个端点都公开了API端点,其中一个端点也提供HTML,
JavaScript和CSS等Web资源.

申请1:

>提供UI文件
>提供API端点

申请2

>提供API端点

申请3

>提供API端点

到目前为止,我们只为应用程序1启用了CSRF验证.这与org.springframework.security.web.csrf.CookieCsrfTokenRepository配合得很好.我们将XSRF-TOKEN作为cookie发送,angularJs在每个请求的头中发回X-XSRF-TOKEN.

现在我们计划将XSRF引入其他两个应用程序,就像我们对Application 1所做的那样.

但是我们遇到了问题. AngularJs从应用程序1发送XSRF-TOKEN,并对所有三个应用程序使用相同的令牌,而每个应用程序每个应用程序都有自己的TOKEN cookie(应用程序路径).

这导致其他两个服务的CSRF验证失败.

这是我使用的配置.

Spring-boot version     : 1.5.3
Angular version         : 1.3.18

  <beans:bean id="csrfTokenRepository" class="org.springframework.security.web.csrf.CookieCsrfTokenRepository">
    <beans:property name="cookieHttpOnly" value="false" />
  </beans:bean>

我得到的错误

{
  "timestamp": 1509437659613,
  "status": 403,
  "error": "Forbidden",
  "message": "Invalid CSRF Token '2fa60cb2-803f-4b2b-a1d6-7e10e56ca649' was found on the request parameter '_csrf' or header 'X-XSRF-TOKEN'.",
  "path": "/application2/posturl/path"
}

这里的令牌2fa60cb2-803f-4b2b-a1d6-7e10e56ca649来自带有cookie路径/ application1的application1.

我到目前为止的观察:

>我检查并确保所有三个应用程序都设置了cookie
是httpOnly = false.
>我可以看到所有三个应用程序都有
他们自己的Chrome开发者控制台中的XSRF-TOKEN cookie
他们自己的道路.
>我没有在角端写一行
更改其默认行为.
>所有三个应用程序都在同一IP和端口上作为WAR文件运行.

What I suspect here is that Angular is not honouring the path
attribute of the cookies and it goes with the first cookie with a name
XSRF-TOKEN.

有办法解决这个问题吗?

最佳答案 您必须更改Angularjs和Spring的默认行为

在Spring Security上,您应该更改xrsft cookie名称(3个应用程序中的每一个都有一个不同).

在Angular上,您可以在每个请求上添加一个拦截器,动态设置标头中的正确cookie值(通过$cookies.get(key)检索它);

点赞