我在Spring Cloud和CSRF保护方面遇到了一些问题。 我使用Spring Cloud Security,OAuth2等保护了我的应用程序(网关和注册服务)。
我授予每个人(permitAll)访问/ signup的权限,这是网关路由到实际注册服务的地方。我还授予了注册服务器本身的所有人访问权限。这可以按预期工作。
令我头疼的是CSRF保护。网关和注册服务都自己创建CSRF令牌。来自网关的令牌将被发送到客户端,并且来自注册服务的令牌丢失(在网关的某处)。
如果我向注册服务发布了一些内容,CSRF保护就会启动并表示令牌为空,或者实际值与预期值不匹配,如果我尝试重用网关中的值,这是可用的在HTTP标头中。
我已经让它在注册服务上禁用CSRF,但它似乎不是正确的解决方案,因为它只有在有人从客户端发回令牌时才有效,就像Angular SPA。当我尝试从浏览器提交表单(在注册服务上呈现)时,由于缺少_csrf参数而失败。 如果我在注册服务上激活CSRF并将_csrf参数添加到表单中,网关的CSRF保护就会启动并说实际令牌与预期令牌不匹配,这是绝对正确的,因为实际令牌是来自注册服务的那个,而预期的令牌来自网关。
我可以在网关上禁用CSRF,但这将导致我必须在REST客户端或SPA使用的每个服务上配置CSRF内容。
我已经在HttpSecurity.csrf()配置中尝试了ignoreAntMatchers(),我可以在其中排除特定路径,但这对我也没有帮助。期望值是完全不同的。它似乎为POST请求创建了一个新会话。
那么有没有机会我可以在网关处使用CSRF,并立即使用表单提交和Zuul进行注册服务?
答案 0 :(得分:0)
您应该能够使其工作:我认为应该在Zuul中禁用CSRF,并且Zuul应该转发来自该服务的原始CSRF令牌。
您是否尝试将自定义“敏感标题”设置为避免丢失令牌?由于默认配置是删除所有“ Cookie”和“ Set-Cookie”标头,因此您需要对其进行更改:
zuul:
routes:
users:
path: /myusers/**
# This is the default value if not set
sensitiveHeaders: Cookie,Set-Cookie,Authorization
url: https://downstream
成为
zuul:
routes:
users:
path: /myusers/**
sensitiveHeaders: Authorization
url: https://downstream