我正在使用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)
}
我该怎么修呢?
1条答案
按热度按时间mlnl4t2r1#
首先,我建议你不要禁用
"X-Frame-Options"
头文件并在iframe中使用你的应用程序。这会带来安全风险,您可以在this answer中阅读更多信息。
现在来解释一下你所看到的行为。
Spring Security使用
Session
cookie来存储用户的会话。Cookie与域相关联,例如,如果有一个Cookie与域
stackoverflow.com
相关联,则该Cookie将包含在对stackoverlow.com
的任何请求中。为了控制这种行为,cookie还具有一个名为
SameSite
的属性。SameSite
attribute可以有3个值,None
,Lax
,Strict
,也可以不设置,没有值。当值为
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
来实现。