【问题标题】:Creating multiple Connection objects for multiple users为多个用户创建多个 Connection 对象
【发布时间】:2012-09-05 17:04:38
【问题描述】:

我使用 Java EE 编写了一个用于更改表格内容的 Web 应用程序。对于用户身份验证,我使用用户的数据库凭据。我正在使用这些凭据创建 JDBC 连接。

当两个或多个用户同时登录并且使用最新用户的凭据更新 Connection 对象时,就会出现问题。所以无论是哪个用户进行了更改,最新用户 gt 的用户名都会登录到日志文件中,这是一个巨大的安全问题。

那么如何为多个用户创建多个 Connection 对象,以便进行修改的用户的唯一用户名出现在日志中。

【问题讨论】:

  • 很想知道如何从连接对象中获取用户信息。
  • 目前是 Netezza,但很快就会迁移到 Vertica。
  • 而且我没有从连接对象中获取用户信息,只是将用户名保留在变量中。

标签: java jakarta-ee web-applications authentication


【解决方案1】:

这听起来好像您将连接对象的引用存储在一个静态变量中,在您的 Web 应用程序中只保留一个连接对象。取而代之的是,您可以使用HttpSession 将用户特定的连接对象作为attribute 存储在用户会话中。在用户第一次访问应用程序时将连接存储在那里,然后在每次后续请求时,获取连接back,检查它是否仍然有效并使用它。

一旦会话超时,不要忘记关闭连接。这可以通过实现HttpSessionListener 来实现,该HttpSessionListener 检查会话中的任何连接并在sessionDestroyed() 方法中关闭它。

编辑:出于多种原因,使用数据库凭据让用户登录应用程序通常不是一个好的设计。但是,如果会话数量较少(因此在 DB 上同时打开的连接数量较少)并且 DB 权限设置合理,这仍然可以正常工作。

编辑 2: 当然,对这种缓存连接的访问​​需要同步(例如,如果用户尝试通过多个同时请求来访问您的应用,例如通过拥有多个浏览器窗口打开)。这可能有点(有点)棘手。

【讨论】:

  • 谢谢大卫。我会尝试这个然后回复你。我之前想创建一个 HttpSession,但在那个时候,感觉就像是一个不必要的麻烦。但看起来现在我无论如何都必须这样做。
  • 谢谢@david a。我在会话中添加了各个用户的 Connection 对象,它就像一个魅力! :)
  • 好 - 请注意重要的一点是确保连接在会话超时时最晚关闭(使用会话侦听器)并同步对它们的访问。
【解决方案2】:

您可能希望将用户名/密码/等存储在HttpSession 中,而不是保留打开并分配给用户的连接列表。想象一下,会有几十或几百个用户——RDBMS 能正确处理这么多的并发连接吗?成千上万的用户呢?

【讨论】:

  • 这当然更容易实现。但是,需要在每个请求处创建连接可能会显着增加应用程序的延迟(取决于数据库)。如果我必须实现这一点(例如,需要 DB 用户),我肯定会缓存连接,或者尝试构建类似每个用户连接池的东西。当然,这永远不会随着用户数量的增加而扩展。
  • 为什么不使用连接对用户进行身份验证,然后再从池中获取连接?我想在数据库层存在某种权限分离,这就是 topicstater 真正想要使用的。
  • 网站不会遇到数千个同时连接。我期望的最大值是 10,因此创建一组不同的身份验证凭据和验证系统对我来说似乎不是正确的选择。
  • 正如@jdevelop 所说,我确实想使用授予表上不同用户的权限来决定他们是否只能查看数据或修改数据。
  • JDevelop - 连接池肯定是最好的选择,但该池中的连接将使用什么凭据? AFAIK 没有(标准)方法来重新验证现有的 JDBC 连接。
猜你喜欢
  • 2022-01-23
  • 1970-01-01
  • 2016-01-24
  • 2011-11-21
  • 2017-09-21
  • 1970-01-01
  • 1970-01-01
  • 2013-07-04
  • 1970-01-01
相关资源
最近更新 更多