java Spring Security页面无法在Chrome上的Iframe中打开

vq8itlhq  于 2023-04-04  发布在  Java
关注(0)|答案(1)|浏览(161)

我正在使用Sping Boot ,Spring Security和jdk 1.8。当我试图在Chrome上的iframe中打开任何安全的Thymleaf页面时,它每次都会将我重定向到登录页面。它在Firefox和IE上工作正常。
当我尝试打开没有iframe的相同URL时,它工作正常。下面是我的Spring Security conf文件代码。还有一件事:两个域是不同的。

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .headers()
                .frameOptions().disable()
                .and()
                .csrf().disable()/*disbaling csrf here*/
                .authorizeRequests()
                .antMatchers("/","/login","/css/**", "/js/**", "/fonts/**","/img/**").permitAll()/*do not use spring security on this path*/
                .and()
                .formLogin()
                .successHandler(successHandler) /*after success login on web we are handling the success event*/
                .permitAll()
                .and()
                .logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout")).logoutSuccessUrl("/login/?logout") /*defining logout and login url here*/
                .permitAll()
                 /*
                 * This is for authentication failure handling
                 * */
                 http.exceptionHandling().authenticationEntryPoint(authenticationEntryPoint)
                 /*Token based authentication we are handling here*/
                 http.addFilterBefore(new StatelessAuthenticationFilter(tokenAuthenticationService), BasicAuthenticationFilter.class);
                 http.addFilterAfter(new SameSiteFilter(), BasicAuthenticationFilter.class)
    }

我该怎么修呢?

mlnl4t2r

mlnl4t2r1#

首先,我建议你不要禁用"X-Frame-Options"头文件并在iframe中使用你的应用程序。
这会带来安全风险,您可以在this answer中阅读更多信息。
现在来解释一下你所看到的行为。
Spring Security使用Session cookie来存储用户的会话。
Cookie与域相关联,例如,如果有一个Cookie与域stackoverflow.com相关联,则该Cookie将包含在对stackoverlow.com的任何请求中。
为了控制这种行为,cookie还具有一个名为SameSite的属性。
SameSite attribute可以有3个值,NoneLaxStrict,也可以不设置,没有值。
当值为None时,其行为如上所述(包括在所有请求中)。
当该值为Lax时,cookie将仅包含在顶级导航GET请求中。
Spring Security使用的Session cookie不设置SameSite属性。
目前(2020年3月),一些浏览器(如Firefox和Edge)将unset属性视为None
然而,Chrome正在尝试将unset属性与Lax相同。
你可以在Chrome Platform Status中阅读更多。
总之,在使用Chrome时,Session cookie被视为将SameSite设置为Lax
由于在iframe中呈现应用程序不是顶级导航,因此Session cookie不包含在来自iframe的请求中,并且应用程序无法知道用户已登录。
您可以使用Spring Session显式地将SameSite属性设置为None
我再次提醒您不要这样做,因为它会使您的应用程序容易受到CSRF和点击劫持攻击。
如果在考虑安全性影响后,您认为有必要将SameSite属性设置为None,则可以通过在依赖项中包含Spring Session并创建自定义CookieSerializer来实现。

相关问题