我正在尝试在Spring webflux应用程序(spring-cloud-gateway
)上实现一个Back-Channel Logout端点。
为此,我需要“静态”检索用户会话,以便:
- 删除匹配
issuer
和subject
但没有用户会话上下文的授权客户端 - 如果移除的授权客户端是该用户的最后一个(具有授权码),则使会话无效。但仅当不再有授权客户端时:如果您使用同一客户端登录Google和Facebook,则当您仅从其中一个客户端注销时,该客户端上的会话应保持活动状态。
当前的ServerWebExchange
由OIDC提供者自己发起,由于不涉及用户浏览器,因此没有会话cookie。
相反,提供了一个“logout”JWT作为请求主体(我在这里找到了issuer
和subject
,它们应该足以标识要失效的会话和要删除的授权客户机)。
对于Servlet,这个问题可以通过实现HttpSessionListener, HttpSessionIdListener
(并使用ServletListenerRegistrationBean
)来解决,每次添加或删除授权客户机时,都可以通过issuer
和用户subject
来构建和维护会话索引。
不幸的是,spring-cloud-gateway
是一个被动的应用程序,我找不到与WebSession
等效的会话侦听器。
有线索告诉我该怎么做吗?
2条答案
按热度按时间vql8enpb1#
一种可能的方法是覆盖默认的
WebSessionManager
配置,并使用手动创建的InMemoryWebSessionStore
bean设置会话存储。然后在注销逻辑中,我们可以注入
InMemoryWebSessionStore
bean,检索所有会话并执行注销:soat7uwm2#
来自@elyorbek-ibrokhimov的答案并没有满足我的需求,即挂钩到会话生命周期,但它确实让我走上了正确的轨道。非常感谢他。以下是我如何实现它(灵感来自
MaxIdleTimeInMemoryWebSessionStore
):现在,我可以针对这个
WebSessionStore
注册一个定制的授权客户端存储库,并让它收到sessionCreated
和sessionRemoved
事件的通知,以更新它自己的索引。