【问题标题】:Configuring grails datasources with username and password from OS environment使用操作系统环境中的用户名和密码配置 grails 数据源
【发布时间】:2016-03-24 12:20:16
【问题描述】:

我目前正在开发一个 grails 应用程序。以前我一直在使用 Django 来创建 webapps。在 django 中,您可以轻松地创建从操作系统环境中收集的设置。我发现这是一个简单的解决方案,可以确保您不会将用户名和密码签入源代码存储库。

所以我想做的是在 DataSource.groovy 中能够从操作系统环境中提取用户名和密码。有没有人做过这样的事情,或者这不是前进的道路?

如果这不是“grails 方式”,应该怎么做,因为在存储库中有用户名和密码感觉不对?

【问题讨论】:

  • 不确定 Grails 但在 Spring 中,您使用 PropertyPlaceHolderConfigurer。然后你可以在你的配置文件中使用 OS envars

标签: grails passwords datasource


【解决方案1】:

您可以在DataSource.groovy 和Config.groovy 中编写代码来获取环境变量,然后设置用户名密码等。我总是将它用于我的生产应用程序,示例代码如下 //示例基于url结构,如“mysql://username:password@host/database?autoReconnect=true&useUnicode=yes&characterEncoding=UTF-8”

dataSource {
            String mysqlUrl = System.getenv("DATABASE_URL")
            println ">>>>>> Got DATABASE_URL: ${mysqlUrl} <<<<<<<"

            URI dbUri = new URI(mysqlUrl);
            username = dbUri.userInfo.split(":")[0]
            password = dbUri.userInfo.split(":")[1]

            String databaseUrl = "jdbc:${dbUri.scheme}://${dbUri.host}${dbUri.path}"
            if (dbUri.port > 0) {
                databaseUrl += ":${dbUri.port}"
            }

            String query = dbUri.query ?: "reconnect=true"
            query += "&autoReconnect=true&useUnicode=yes&characterEncoding=UTF-8"
            databaseUrl += "?${query}"
            url = databaseUrl
            dialect = 'org.hibernate.dialect.MySQL5InnoDBDialect'
        }

这是我确信必须有一些更简单的方法来做到这一点的方法之一。

PS:不过我觉得很简单 :)

【讨论】:

  • 谢谢,这正是我想要的!我没有意识到您可以在 DataSource.groovy 文件中编写高级代码。太棒了!
【解决方案2】:

我们在工作中使用JNDI 来处理这种情况。我们在单个服务器的 Tomcat 目录中有 context.xml 文件。 context.xml 包含数据源属性,然后在 datasource 闭包(在 Datasource.groovy 中定义)内,相应地设置 jndiName 属性。

更多关于 JNDI 的链接:

【讨论】:

    【解决方案3】:

    您可以在任何其他地方将配置外部化,然后在您的应用程序配置中简单地加载/合并它。

    【讨论】:

    • 好的。这也是我在谷歌搜索时看到的,但我认为这是一种非常繁琐的方式来做一些应该很容易的事情。我想创建一个包含 username = System.getenv(DB_USERNAME) 的 DataSource.groovy 文件
    【解决方案4】:

    您可以在 Windows 中创建环境变量。示例 DBCONNGRAILS。在 config.groovy (...\grails-app\conf\config.groovy) 你可以使用类似

    def myConnectionString = System.getenv(DBCONNGRAILS)
    

    警告:如果您从环境(Windows)中获取变量,则在开发时加载值不会有问题。但是当您使用生产服务器时,有时您需要重新启动操作系统以使 tomcat 能够获取更改。我建议将配置文件外部化。

    【讨论】:

    • 公平点奥马尔。然而,就像我说的,我主要将它用于不会经常更改的事情(数据库密码、电子邮件配置等)。至少这就是我在 django 中的做法。我不能直接在 DataSource.groovy 文件中这样做吗?
    • 我已经看到它直接在数据源中完成,heroku 就是这样做的。但我仍然相信在配置文件中这样做可能会更好。以下是在 heroku 中如何完成的示例:Grails on heroku.
    • 谢谢奥马尔!我现在已经尝试了上面接受的解决方案,并将使用它。
    猜你喜欢
    • 2018-11-18
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 2011-11-14
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    相关资源
    最近更新 更多