首页 > 解决方案 > Spring 的 SwitchUserFilter 线程安全吗?

问题描述

我最近SwitchUserFilter在我的 Spring (4.3.17) 应用程序中实现了。虽然最初看起来一切都很好,但我们开始遇到 403Access Denied错误,或者在退出模拟后突然被重定向到我们的登录页面,然后尝试重新模拟相同或备用用户。

我在这上面花了整整 3 天的时间,并且已经深入调试了 Spring 的深度,主要集中在过滤器链和身份验证上,以试图了解正在发生的事情。我发现我们遇到了以下情况:

  1. 管理员用户模拟标准用户
  2. 管理员用户在页面完全加载之前退出模拟(AJAX 请求待处理)
  3. Admin 被正确重定向到SwitchUserFilterexit targetUrl ...此时,Spring security/auth/roles 在过滤器链、会话和SecurityContext.contextHolder. 然后...
  4. Spring 开始处理源自上述步骤 2 的 Ajax 请求。
  5. Spring 为来自 session 的延迟请求加载身份验证,并且是模拟用户的 auth
  6. Spring 处理请求,进行身份验证,因为它将当前会话视为用户的会话,并且过滤器链SecurityContext使用模拟的会话更新。

此时管理员用户正坐在一个仅限管理员的页面上,但在幕后 Spring 已经SecurityContext用用户的身份覆盖了身份验证。现在,如果管理员尝试重新加载页面,他们将重定向到管理员登录。如果他们试图冒充,他们会看到一个通用的 403。

在我看来,第 5 步发生的唯一方法是,如果 Spring 已从会话加载用户身份验证,然后用户退出模拟,Spring 恢复了对会话的管理员身份验证,最后 Spring 完成了(陈旧)用户会话身份验证的处理并最终用用户的覆盖管理会话身份验证。

抱歉,这太啰嗦了,这几天令人沮丧,我不知道从哪里开始。在我看来,这可能与线程相关,所以想问一下,当然要提供必要的上下文。

标签: javaspringthread-safetyimpersonation

解决方案


推荐阅读