Spring的SwitchUserFilter线程安全吗?

时间:2018-08-29 20:24:03

标签: java spring thread-safety impersonation

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

我花了整整3天的时间,并在此之前对Spring进行了深入的调试,主要关注于过滤链和身份验证以试图了解正在发生的事情。我发现的是,我们正在遇到以下情况:

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

这时,管理员用户正坐在仅管理员页面上,但在后台,Spring已用用户的SecurityContext身份验证进行了覆盖。现在,如果管理员尝试重新加载页面,则将其重定向到管理员登录名。如果他们尝试假冒,则会看到通用的403。

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

很抱歉,这太漫长了,这几天令人沮丧,我不确定从这儿去哪里。在我看来,这可能与线程相关,因此想询问一下,当然要提供必要的上下文。

0 个答案:

没有答案