Java 加载弹簧Webflux在外部iframe中的应用
Spring启动版本:2.3.0.0版本 使用spring引导应用程序作为Java 加载弹簧Webflux在外部iframe中的应用,java,spring,spring-boot,spring-security,spring-webflux,Java,Spring,Spring Boot,Spring Security,Spring Webflux,Spring启动版本:2.3.0.0版本 使用spring引导应用程序作为iframe的src,在类路径中使用spring安全性,webflux和servlet应用程序的行为不同 反应式webapp的安全配置: @配置 @启用WebFluxSecurity 公共类SecurityConfig{ @豆子 公共安全WebFilterChain安全WebFilterChain(ServerHttpSecurity http){ 返回http .headers().frameOptions().disa
iframe
的src
,在类路径中使用spring安全性,webflux和servlet应用程序的行为不同
反应式webapp的安全配置:
@配置
@启用WebFluxSecurity
公共类SecurityConfig{
@豆子
公共安全WebFilterChain安全WebFilterChain(ServerHttpSecurity http){
返回http
.headers().frameOptions().disable()
.及()
.授权交易所()
.anyExchange().authenticated()
.及()
.formLogin()
.及()
.build();
}
}
servlet webapp的安全配置:
@配置
@启用Web安全性
公共类SecurityConfig扩展了WebSecurity配置适配器{
@凌驾
受保护的无效配置(HttpSecurity http)引发异常{
http.headers().frameOptions().disable()
.及()
.授权请求()
.anyRequest().authenticated()
.及()
.formLogin();
}
}
使用上面给出的tomcat服务器和安全配置,用户将登录,并成功返回200 OK的响应。
webflux中带netty服务器的Simliar配置响应为403禁止,响应为
CSRF令牌已关联到此客户端
可能与设置cookie的SameSite=Lax有关;在webflux中。
在任何外部域中使用iframe
,并将src
设置为spring boot app。如果无法重新生成问题,请尝试删除Cookie
示例应用程序-
用例:许多客户关系管理服务集成要求应用程序在其iframe中打开,在这种特殊情况下,此应用程序用于Salesforce集成
问题:
有没有办法使用spring webflux作为依赖项登录外部iframe?
CookieWebSessionIdResolver
bean可以定制为使用不同的会话cookie选项。
sameSite(属性)
可用于将sameSite值设置为“无”、“松弛”或“严格”
@Bean
公共WebSessionIdResolver WebSessionIdResolver(){
CookieWebSessionIdResolver解析器=新建CookieWebSessionIdResolver();
解析程序setCookieName(“会话”);
解析器.addCookie初始值设定项((生成器)->{
builder.path(“/”)
.httpOnly(真)
.安全(正确)
.sameSite(“无”);
});
返回解析器;
}
会话配置:
@Configuration
@EnableSpringWebSession
public class SessionConfig {
@Bean
public ReactiveSessionRepository<MapSession> sessionRepository() {
return new ReactiveMapSessionRepository(new ConcurrentHashMap<>());
}
@Bean
public WebSessionIdResolver webSessionIdResolver() {
CookieWebSessionIdResolver resolver = new CookieWebSessionIdResolver();
resolver.setCookieName("SESSION");
resolver.addCookieInitializer((builder) -> {
builder.path("/")
.httpOnly(true)
.secure(true)
.sameSite("None");
});
return resolver;
}
}
@配置
@启用SpringWebSession
公共类会话配置{
@豆子
公共反应会话存储库会话存储库(){
返回新的ReactiveMapSessionRepository(新的ConcurrentHashMap());
}
@豆子
公共WebSessionIdResolver WebSessionIdResolver(){
CookieWebSessionIdResolver解析器=新建CookieWebSessionIdResolver();
解析程序setCookieName(“会话”);
解析器.addCookie初始值设定项((生成器)->{
builder.path(“/”)
.httpOnly(真)
.安全(正确)
.sameSite(“无”);
});
返回解析器;
}
}
Spring会话核心依赖项:
org.springframework.session
浏览器控制台中是否存在任何错误/警告?Chrome和Firefox可能会注意到他们正在阻止的任何东西及其原因。@OrangeDog是的,在登录页面中的webflux响应cookie默认设置了Samesite=Lax。Chrome在网络面板中显示此警告,并在抛出登录403后显示此集合Cookie被阻止,因为它具有“Samesite=Lax”属性,但来自一个跨站点响应,而该响应不是对顶级导航的响应
这是您的答案。您可以在下面编写并接受它。@OrangeDog但这并不能解决登录问题,我需要一个解决方法来从Spring安全会话cookie中禁用Samesite属性。