SpringBoot - 如何配置相同站点无 Csrf Cookie

问题描述 投票:0回答:1

我有:

  • 我在不同的域(不是子域)中有 sprint boot api 和 Angular 应用程序,并且无法更改它。
  • 我只授予 cors 对我的 Angular 域应用程序的访问权限

我需要什么:

  • 我需要使用带有samesite=none的Csrf cookie来允许来自Chrome浏览器的身份验证,因为它不起作用,我认为是因为默认的samesite=lax默认策略。在 Firefox 中工作正常。

我尝试了什么

  • 我已经更新到 spring 2.7 尝试使用
    server.servlet.session.cookie.same-site= none
    属性,但是 它只影响 JSESSIONID cookie。它不适用于 csrf cookie。
  • 我已经更新到spring 3尝试使用CookieCsrfTokenRepository.setCookieCustomizer()方法,我找不到关于我可以使用此方法配置cookie的信息
  • 我尝试实现 OncePerRequestFilter 并修改了 header
    Set-cookie
    ,但是随后,我丢失了 JSESSIONID cookie 的 set-cookie 标头。

¿我可以做什么来获取 csrf cookie Samesite=none? ¿还有其他解决方案可以在不同域的 chrome 中运行 csrf 身份验证吗?

提前致谢

spring-boot spring-security csrf samesite cross-site
1个回答
0
投票

我找到了解决方案

  1. 首先,使用
    CookieCsrfTokenRepository
    方法和
    setCookieCustomizer
     创建自定义 
    Consumer<ResponseCookie.ResponseCookieBuilder>
        CookieCsrfTokenRepository tokenRepository = new CookieCsrfTokenRepository();
        tokenRepository.setCookieCustomizer(new Consumer<ResponseCookie.ResponseCookieBuilder>() {
            
            @Override
            public void accept(ResponseCookieBuilder t) {
                t.sameSite("none");
                t.secure(true);
                t.httpOnly(false); //Js can read
            }
        });

  1. filterChain(HttpSecurity http)
    申请方法:

@Configuration
@EnableWebSecurity
public class SecurityJavaConfig {
@Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        
        //Configuramos el Csrf Token repository para tener una cookie cross domnain
        CookieCsrfTokenRepository tokenRepository = new CookieCsrfTokenRepository();
        tokenRepository.setCookieCustomizer(new Consumer<ResponseCookie.ResponseCookieBuilder>() {
            
            @Override
            public void accept(ResponseCookieBuilder t) {
                t.sameSite(csrfSameSiteCookie);
                t.secure(csrfSecureCookie);
                t.httpOnly(false); //Para que js pueda leer la cookie
            }
        });        
        
        http
            .cors((cors) -> cors.configurationSource(corsConfigurationSource()))
            .csrf((csrf) -> csrf
                    .csrfTokenRepository(tokenRepository)
            )
            .sessionManagement(session  -> session.sessionCreationPolicy(SessionCreationPolicy.ALWAYS))
            //Autorizaciones end-points
            .authorizeHttpRequests((authorize) -> authorize
                    .requestMatchers(HttpMethod.OPTIONS,"/**").permitAll()
                    .requestMatchers(HttpMethod.GET,"/csrf").permitAll()
                    .anyRequest().authenticated()
            )
            .httpBasic(withDefaults());;

 
        return http.build();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.