我在使用Spring Cloud和CSRF保护时遇到了一些问题。
我通过Spring Cloud Security,OAuth2等为我的应用程序(网关和注册服务)提供了安全保护。
我允许每个人(permitAll)访问/signup这个网关路由到实际注册服务的地方。我还允许每个人访问注册服务器本身。这正常工作。
让我头痛的是CSRF保护。网关和注册服务都会创建自己的CSRF令牌。网关的令牌将发送给客户端,而注册服务的令牌则丢失(某处在网关)。
如果我向注册服务提交内容,则CSRF保护会启动并表示令牌为null或实际值与预期值不匹配,如果我尝试重用来自网关的值(可在HTTP标头中获取)。
我已经通过禁用注册服务上的CSRF使其正常工作,但这似乎不是正确的解决方案,因为它只适用于某人从客户端发送令牌,例如Angular SPA。当我尝试从浏览器提交表单(在注册服务上呈现)时,由于缺少_csrf参数,此操作失败。
如果我在注册服务上激活CSRF并将_csrf参数添加到表单中,则网关的CSRF保护会启动并表示实际令牌与预期令牌不匹配,这是完全正确的,因为实际令牌来自注册服务,而预期令牌来自网关。
我可以禁用网关上的CSRF,但这将导致我必须在每个被REST客户端或SPA使用的服务上配置CSRF设置。
我尝试在HttpSecurity.csrf()配置中使用ignoreAntMatchers()来排除特定路径,但这也没有帮助我。预期值是完全不同的。似乎为POST请求创建了一个新会话。
那么,有没有可能一次使用CSRF,表单提交和Zuul在网关和注册服务上?