【问题标题】:Building Production Release - DB Connection Credentials构建生产版本 - 数据库连接凭据
【发布时间】:2011-06-18 16:56:47
【问题描述】:

我们有一个构建可以为特定环境打包战争文件,我们所有的属性文件都嵌入到存档(war 文件)中。

我们现在即将进行生产。我担心的是代码库将需要公开生产数据库密码,尽管不太可能存在运行生产构建配置文件的风险。

我想消除这种风险的选项是不将生产细节存储在 SVN 中,并且:

  1. 让管理员覆盖用于连接数据库的系统属性,或者

  2. 让容器管理数据库连接而不是 c3p0,这样他们就可以自己管理此配置。

你有什么建议吗?

【问题讨论】:

    标签: java deployment build build-process dev-to-production


    【解决方案1】:

    在生产中,我赞成完全不在属性文件中存储凭据的方法。相反,我更喜欢应用程序服务器使用jndi 提供凭据。

    如果您使用的是 Apache Tomcat,请参阅他们的 jndi reference

    【讨论】:

      【解决方案2】:

      我尝试过在存档中和存档之外都拥有属性,并且让它们在存档之外更容易管理此类问题。

      注意事项:

      1. 在可能的范围内,您可以为属性设置默认值,这样如果找不到该属性,它将使用默认值(例如,使用“localhost”作为默认数据库连接 URL)。
      2. 您仍然可以将非生产环境的属性文件与代码一起保存在源代码管理中。

      使用这两个策略,开发人员可以负责管理非生产属性文件,因此这些文件也可以作为生产管理员的示例。它还将大多数属性集中在源代码控制中,提供了保持集中的一些好处,同时仍然充分解耦了属性。

      编辑:请注意,JNDI 是一个选项,但在架构上它与在外部存储属性文件相同 - 您仍然需要注意对这些文件进行版本控制,以免它们在不同的环境中松散。

      【讨论】:

      • 将属性放在外面不是一种选择。不要问为什么 :) 看起来 jndi 是要走的路。
      【解决方案3】:

      您绝对应该将生产数据库用户名和密码放入您的源代码控制系统。您的应用应该使用由生产环境中的管理员控制/限制的 JNDI 获取其数据库连接(例如 DataSource)。

      例如,如果您的应用部署到 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 安装,因此任何没有管理员访问权限的人都无法在您的 prod 服务器上使用它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多