【发布时间】:2021-03-15 17:51:02
【问题描述】:
我正在尝试将 CSRF 保护添加到基于 Spring-Boot(尤其是 WebFlux)的项目中。
到目前为止我所尝试的低于安全配置。
@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
http.
...
.and()
.csrf()
.csrfTokenRepository(CookieServerCsrfTokenRepository.withHttpOnlyFalse())
.requireCsrfProtectionMatcher(
new NegatedServerWebExchangeMatcher(
new OrServerWebExchangeMatcher(
Arrays.asList(
ServerWebExchangeMatchers.pathMatchers(HttpMethod.POST, FORM_LOGIN_URL),
ServerWebExchangeMatchers
.pathMatchers(HttpMethod.GET, PERMISSION_ENDPOINT)
)
)
)
)
.accessDeniedHandler(new CustomHttpStatusServerAccessDeniedHandler(HttpStatus.FORBIDDEN))
...;
return http.build();
}
但是当我尝试上述配置时,我看不到任何与从服务器推送到浏览器的 CSRF 令牌相关的内容。不是默认推送给客户端吗?如果是这样,向客户端(浏览器)提供 CSRF 令牌的更简洁的方法是什么?在哪个春季文档中提到了这一点。 (我关注了这个->https://docs.spring.io/spring-security/site/docs/3.2.0.CI-SNAPSHOT/reference/html/csrf.html)
附: (希望以下这些信息对答案有用)
- Spring Boot Webflux 应用程序没有提供我的登录表单。它由在不同域(不同 IP 和端口)上运行的 Angular 应用程序提供服务。这就是为什么我在上面的配置中有一个
FORM_LOGIN_URL常量,用作.loginPage(FORM_LOGIN_URL)。我已经自定义了.authenticationSuccessHandler()以重定向到PERMISSION_ENDPOINT,它一直按预期工作。
【问题讨论】:
标签: angular spring spring-boot spring-security spring-webflux