SpringBoot -如何配置同一站点无CSRF Cookie(Spring Security 6.2)

gopyfrb3  于 5个月前  发布在  Spring
关注(0)|答案(1)|浏览(50)

我有什么:

  • 我有sprint Boot API,和Angular 的应用程序在diferents域(不子域),并不是一个选项改变它.
    *我只允许cors访问我的angular domain应用

我需要什么:

  • 我需要使用Csrf cookie与samesite=无允许从Chrome浏览器的身份验证,因为它不工作,我认为是因为默认的samesite=宽松的默认策略.在火狐工作正常.

我尝试了什么

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

<$我能做些什么来获得csrf cookie samesite=none?<$有没有其他的解决方案来运行csrf身份验证在Chrome与diferents域?
Thanks in advance

beq87vna

beq87vna1#

我找到解决办法了
1.首先,使用带有Consumer<ResponseCookie.ResponseCookieBuilder>setCookieCustomizer metohd创建自定义CookieCsrfTokenRepository

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();
    }
}

相关问题