我们有一个构建可以为特定环境打包战争文件,我们所有的属性文件都嵌入在存档(war 文件)中。
我们现在即将进行生产。我担心的是代码库将需要公开生产数据库密码,尽管不太可能存在生产构建配置文件运行产生负面影响的风险。
我想消除这种风险的选项是不将生产细节存储在 SVN 中,并且:
让管理员覆盖用于连接数据库的系统属性,或
让容器管理数据库连接而不是 c3p0,这样他们就可以自己管理此配置。
你有什么建议吗?
我们有一个构建可以为特定环境打包战争文件,我们所有的属性文件都嵌入在存档(war 文件)中。
我们现在即将进行生产。我担心的是代码库将需要公开生产数据库密码,尽管不太可能存在生产构建配置文件运行产生负面影响的风险。
我想消除这种风险的选项是不将生产细节存储在 SVN 中,并且:
让管理员覆盖用于连接数据库的系统属性,或
让容器管理数据库连接而不是 c3p0,这样他们就可以自己管理此配置。
你有什么建议吗?
您绝对不应该将生产数据库用户名和密码放入您的源代码控制系统。您的应用程序应该DataSource
使用由生产环境中的管理员控制/限制的 JNDI 获取其数据库连接(例如 a )。
例如,如果您的应用程序部署到 Tomcat,则在 tomcat/conf/context.xml 中有以下内容
<Resource name="jdbc/myDB"
auth="Container"
type="javax.sql.DataSource"
maxActive="20"
maxIdle="10"
maxWait="3000"
username="myusername"
password="mypassword"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://myhost:3306/myschema"
defaultAutoCommit="false"/>
..并且连接是在java:/comp/env/jdbc/myDB
您的应用程序无需提供用户名或密码的情况下获得的。管理员在 prod 服务器上保护了 tomcat 安装,因此任何没有管理员访问权限的人都无法使用它。
在生产中,我赞成根本不将凭据存储在属性文件上的方法。相反,我更喜欢应用程序服务器使用jndi
.
如果您使用的是 Apache Tomcat,请参阅例如他们的jndi 参考。
我已经尝试过在存档中和存档之外都拥有属性,并且让它们在存档之外更容易管理此类问题。
需要注意的一些事项:
使用这两个策略,开发人员可以负责管理非生产属性文件,因此这些文件也可以作为生产管理员的示例。它还使大多数属性集中在源代码控制中,提供了保持集中的一些好处,同时仍然充分解耦了属性。
编辑:请注意,JNDI 是一个选项,但在架构上它与在外部存储属性文件相同 - 您仍然需要注意对这些文件进行版本控制,不要让它们在不同的环境中松散。