【发布时间】:2015-06-21 04:28:45
【问题描述】:
我刚刚完成了我的 Web 应用程序(部署在 Tomcat 上)的设置,以使用 Apache Commons DBCP2 连接到 Postgres。数据库凭据在 context.xml 的 Resource 标记中指定,如下所示:
<Context>
<Resource name="jdbc/postgres" auth="Container"
type="javax.sql.DataSource" driverClassName="org.postgresql.Driver"
url="jdbc:postgresql://127.0.0.1:5432/postgres"
username="my-user-name" password="my-password"
initialSize="1" maxTotal="20" minIdle="1" maxIdle="5"
.../>
</Context>
我以通常的方式获得连接:
DataSource ds = (DataSource)(new InitialContext().lookup("java:/comp/env/jdbc/postgres"));
Connection conn = ds.getConnection();
问题是我不能像这样在 xml 文件中明确指定数据库凭据进行生产。
我看到DataSource接口有getConnection(user, password)的方法但是BasicDataSource实现不支持这个操作(thorws UnsupportedOperationException)
如何使 DBCP 配置为生产做好准备?
【问题讨论】:
-
基于 server.xml 的资源在生产环境中被广泛使用,它被认为足够安全并且可以用于生产。如果您需要在应用程序中提供灵活性,您可能需要将用户名和密码存储在文件中。资源是最安全的方式之一。
-
解决方案最终是服务器的物理安全,包括访问卡、日志记录等等。
-
@shazin 是正确的,它被广泛使用,您只能依靠应用服务器安全来保护您的数据库。仅仅因为它被广泛使用并不能使它正确或充分。我要指出的是,这种松懈的安全方法已使数据泄露成为行业标准。
-
这里有一个很好的示例 (jdev.it/encrypting-passwords-in-tomcat),说明如何使用在 context.xml 中加密的密码创建数据源。您不必将明文密码存储在文件中。
-
@ramp - 感谢您的链接。为了将来读者的利益,我将总结一下:建议的解决方案是编写一个自定义 DataSourceFactory,它接受加密的凭据并能够在创建 DataSource 时对其进行解密。这是一个有效的解决方案。但是,它有两个问题:
标签: java tomcat jdbc apache-commons-dbcp