2012-09-05 70 views
4

您在哪里存储您的凭证,如密钥,邮件密码,db密码?Playframework 2 - 存储您的凭证

我做了https://security.stackexchange.com/questions/19785/security-concerns-about-my-webapp/19786#19786

后它似乎保存凭证的最好办法是在外部服务器上。

但play2使用application.conf来做到这一点。

  • 那么你如何以及在哪里将你的凭证存储在play2中?

更新1:

好吧,我使用的Heroku。

设置我喜欢这个环境变量:

heroku config:add test=ITWORKS 

在application.conf我加

sometest=${test} 

我试图访问它像这样:

Logger.info(Play.application().configuration().getString("sometest")); 

,但我得到出现以下错误:

UnresolvedSubstitution: conf\application.conf: 54: Could not resolve substitution to a value: ${test} 

所以我想play2没有找到变量测试,因为它在heroku上。但之后我也将它添加到我的本地Windows环境中 - >仍然是同样的错误。

任何想法是什么错?

UPDATE2:

好它的作品,我只是重新启动后,我增加了一个环境变量。

最后一个问题:

这是有点儿讨厌添加系统变量,每次我的本地机器上。有没有开发模式?

回答

3

ad。 3:在Play application.conf无法通过任何route或其他类型的path访问,因此它不能被视为'放入webroot'。特里的建议在PHP中是适当的,但不适合于Play(他警告说,他不知道框架)。他给出了一个PHP脚本的样本,但相信我,访问http://somdomain.tld/config.php和Play的conf/application.conf之间的差异是巨大的。他们不能直接比较。

application.conf中存储凭证是目前最安全(也是最快)的方式,即使解析器会死(这不可能,因为它不是PHP),我无法想象在浏览器中反编译文件的方法。如果您决定将凭据存储在远处,您将获得新的风险,因为您需要额外检查客户是否有权获取配置,应用程序启动所需的时间会增加等等。

更新1:

使用环境变量是不是一种安全的方式 - 马吕斯指出,它会出现在进程列表,所以你出示证件到每个管理,我敢肯定,你不不想用ie做到这一点。你的邮件。

在Heroku当然是通过他们的数据库连接URL,但其他凭据应该存储在配置文件中。最后请记住Procfile command length is limited到255个字符,因此将所有凭据放入它将会导致您的应用有一天无法启动。

在这种情况下,分辨率是使用alernative configuration files,情况是相当简单

    application.conf
  1. 保持一个URL到你的生产数据库如果它的Heroku最有可能db.default.user和共同Heroku的URL中包含凭据db.default.password要评论它。
  2. 为您的本地版本创建一个文件,即:conf/local_postgres.conf在开头包含application.conf并覆盖/添加所有必需的配置密钥,如证书到您本地的Postgres数据库。此外,您可以设置其他事情,更改日志记录级别,启用smtp.mock等。
  3. 使用此conf在本地运行您的应用程序。 (请注意,我在-Dconfig.resource上遇到了一些问题,所以我不得不使用-Dconfig.file语法代替,因此您必须找到哪种方法在您的系统中运行良好)。

    play -Dconfig.resource=local_postgres.conf "~run 9123" 
    

    提示:使用非默认端口是“演示”您使用本地配置的最简单方法。如果您忘记了自己有其他配置,并会使用常见的play ~run命令启动您的应用,则您在http://localhost:9123位置的应用将不可用。

  4. 创建一个bash脚本run-local(或run-local.bat文件在Windows中)并放置那里的命令从前一点。在.gitignore文件中忽略它。

从现在开始你就可以运行从点4脚本当地发展的应用程序,同时推送到Heroku的,你不要在Procfile设置替代配置将部署从application.conf值您的应用程序。还有一些其他组合可以在Heroku的SQL中本地运行应用程序,以执行演变而不需要将其推向部署,或者检查最新的修复包。当然,您必须始终确保您正在开发本地数据库版本,否则可能会意外更改/摧毁您的生活数据。

更新2:

最后使用*.conf文件是不是将其存储在的情况下单独的类更好,当你需要更改配置不同位置(如没有提到,团队工作相同的代码,开发/ PROD环境等)

当然可以缩短为:

import play.Configuration; 
import play.Play; 

// ... 
Configuration cfg = Play.application().configuration(); 

cfg.getString("smtp.password"); 
cfg.getBoolean("smtp.mock"); 
cfg.getInt("smtp.port"); 
+0

非常感谢!只有一个问题,Marius建议我使用环境变量,但将它们添加到本地计算机上会有点麻烦,否则它显然不起作用。最糟糕的部分是我每次添加新变量时都需要重新启动计算机。那么我的本地机器是否有解决方法? –

+0

@MaikKlein查看我的更新1了解更多详情。 – biesior

+0

我会反过来 - 在本地使用application.conf,然后在你的'prod.conf'中用'include'application.conf“'包含它,所以你不必记得运行一个额外的游戏配置文件。 –

3

application.conf支持环境变量,例如, db.default.user=${DB_USER}。您可以将其作为控制台参数传递(由于它出现在ps中,因此不安全),或者更安全地将其设置为环境变量。

在Heroku上,通过heroku config设置环境变量,例如, heroku config:add DB_USER=MyDBAdmin

本地你可以通过export DB_USER=MyDBAdmin来设置它们,或者将它们添加到你的~/.bash_profile(如果你使用bash)。

+0

没关系啊!感谢我给它一个尝试 –

+0

我试图使用它,但我遇到了一个犯错或 - >更新我的第一篇文章 –