gpt4 book ai didi

hibernate - Tomcat 上的 Spring Security/JSF/Hibernate 意外 session 劫持?

转载 作者:行者123 更新时间:2023-11-28 21:47:19 27 4
gpt4 key购买 nike

前几天发生了一件非常奇怪和尴尬的事情,我无法用语言来描述发生的事情。

我的应用程序在 Tomcat 7 上运行与 JSF 2.1、Hibernate 4、Spring Security 集成的 Spring 3。我正在和 C 级的某个重要人物通电话,我们同时在同一时间在测试环境中相同的页面。当他的页面显示我的个人帐户详细信息时,他几乎在同一时刻导航到我正在导航的页面。我不相信他,所以我走到他的办公室,果然,他以某种方式登录了我的帐户,但他没有密码。

该应用程序将保护患者的健康信息,因此我被命令向 C 级提供一份完整的报告,说明所发生的事情,但我不知道这是怎么可能的。我搜索了代码库,但一无所获。我曾多次尝试重现确切的场景,但始终无法重现。我什至没有一个有根据的猜测是我满意的。

我认为可能对存储在 Tomcat 应用程序上下文实现中的 session 进行了一些不安全的线程操作,但如果它不可重现,我无法证明这一点。我还认为,由于 Spring Security 在其他请求和转发之前作为过滤器运行,因此可能是其他 servlet 过滤器之一受到干扰。另外两个是我最近添加的 Primefaces 文件上传过滤器和 Omnifaces SEO 过滤器。

Omnifaces 过滤器实际上确实干扰了 Primefaces 文件上传过滤器,我不得不修改它的配置,以便它们两个可以很好地相互配合,所以我仍然觉得这也有可能。

是否有任何已知的 Spring Security 错误导致了类似的问题? Tomcat 是否存在关于从 ApplicationContext 意外提供错误 session 状态的已知问题?有没有其他人遇到过类似的问题或对此有一些独特的见解?

编辑:发布后不久,我发现了这个,几天前才发布:

Session mix up - apache httpd with mod_jk, tomcat, spring security - serving data of other user

它几乎与我在 Tomcat 前面安装 Apache httpd+mod_jk 插件的设置完全相同,所以我肯定没疯 :)

更新:

我能够在前面没有 mod_jk 或 Apache 的情况下在我的开发环境中重现该问题,因此我可以可靠地排除这是罪魁祸首。

最佳答案

我想通了:)

这有点像开发人员的错误,但它也是 Spring 的一个荒谬的默认行为。我有一个名为 SessionBean 的 JSF 托管 Bean,我声明为 @SessionScope。当您集成 JSF 和 Spring 时,JSF 依赖注入(inject)与 Spring 依赖注入(inject)发生冲突,因此 Spring 重写了处理该问题的 JSF 模块,改为只包装 Spring DI。因此,当我将 JSF ManagedBean 声明为 Session Scoped 时,我还必须给它一个 @Controller 注释,以便它也被识别为 Spring Bean。

事实证明,Spring 并不理解 JSF @RequestScoped@SessionScoped 注释。 Spring 有自己的注解,简单地称为 @Scope(value = "request|session|singleton?|etc...")

因为 Spring 不识别我设置的 JSF 作用域,它在默认情况下将新创建的 bean 视为 SINGLETON。

所以每次有人登录时,它都会覆盖我用来缓存从身份验证主体中获取的登录用户的属性。然后,所有执行任何操作的人都以不同的用户身份登录。

顺便说一句,警告您您错误地配置了该死的 bean。

感谢大家的帮助,希望对 future 的访客有所帮助!

关于hibernate - Tomcat 上的 Spring Security/JSF/Hibernate 意外 session 劫持?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14845493/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com