我最近在Spring(4.3.17)应用程序中实现了SwitchUserFilter
。最初看起来一切正常,但我们开始遇到403 Access Denied
错误,或者退出模拟后突然重定向到我们的登录页面,然后尝试重新模拟相同或替代用户。
我花了整整3天的时间,并在此之前对Spring进行了深入的调试,主要关注于过滤链和身份验证以试图了解正在发生的事情。我发现的是,我们正在遇到以下情况:
SwitchUserFilter
出口targetUrl
...此时,Spring安全性/ auth /角色在过滤器链,会话和SecurityContext.contextHolder
中看起来都正确。然后... SecurityContext
。这时,管理员用户正坐在仅管理员页面上,但在后台,Spring已用用户的SecurityContext
身份验证进行了覆盖。现在,如果管理员尝试重新加载页面,则将其重定向到管理员登录名。如果他们尝试假冒,则会看到通用的403。
在我看来,发生步骤5的唯一方法是,如果Spring从会话中加载了用户身份验证,然后用户退出了模拟,并且Spring恢复了对会话的管理员身份验证,最后Spring完成了(过时的)处理用户会话身份验证,并最终用用户的身份覆盖管理会话身份验证。
很抱歉,这太漫长了,这几天令人沮丧,我不确定从这儿去哪里。在我看来,这可能与线程相关,因此想询问一下,当然要提供必要的上下文。