java - Spring 的 SwitchUserFilter 线程安全吗?
问题描述
我最近SwitchUserFilter
在我的 Spring (4.3.17) 应用程序中实现了。虽然最初看起来一切都很好,但我们开始遇到 403Access Denied
错误,或者在退出模拟后突然被重定向到我们的登录页面,然后尝试重新模拟相同或备用用户。
我在这上面花了整整 3 天的时间,并且已经深入调试了 Spring 的深度,主要集中在过滤器链和身份验证上,以试图了解正在发生的事情。我发现我们遇到了以下情况:
- 管理员用户模拟标准用户
- 管理员用户在页面完全加载之前退出模拟(AJAX 请求待处理)
- Admin 被正确重定向到
SwitchUserFilter
exittargetUrl
...此时,Spring security/auth/roles 在过滤器链、会话和SecurityContext.contextHolder
. 然后... - Spring 开始处理源自上述步骤 2 的 Ajax 请求。
- Spring 为来自 session 的延迟请求加载身份验证,并且是模拟用户的 auth。
- Spring 处理请求,进行身份验证,因为它将当前会话视为用户的会话,并且过滤器链
SecurityContext
使用模拟的会话更新。
此时管理员用户正坐在一个仅限管理员的页面上,但在幕后 Spring 已经SecurityContext
用用户的身份覆盖了身份验证。现在,如果管理员尝试重新加载页面,他们将重定向到管理员登录。如果他们试图冒充,他们会看到一个通用的 403。
在我看来,第 5 步发生的唯一方法是,如果 Spring 已从会话加载用户身份验证,然后用户退出模拟,Spring 恢复了对会话的管理员身份验证,最后 Spring 完成了(陈旧)用户会话身份验证的处理并最终用用户的覆盖管理会话身份验证。
抱歉,这太啰嗦了,这几天令人沮丧,我不知道从哪里开始。在我看来,这可能与线程相关,所以想问一下,当然要提供必要的上下文。
解决方案
推荐阅读
- r - 向量被存储为数据框而不是向量
- wpf - wpf Grid中的分页
- javascript - JS RegExp 如何不允许特殊字符和数字?
- wpf - 更新后 WPF ClickOnce 应用程序的开始菜单图标错误。
- c++ - Rextester 语言编译 C++ 问题
- visual-studio-code - 阻止 VSC 将所有 javascript 文件显示为 React 文件
- ios - 如何减少 XMPP 框架中的 CPU 使用率
- laravel - Laravel 5.7:我在哪里可以注册允许的 GET 参数并阻止其他人?
- java - 即使声明了方法也无法识别
- ios - iOS 如何使用 parse swift 4 从 Facebook 获取用户照片