我知道Magento将数据库连接详细信息存储在local.xml
文件中,但是出于安全考虑,我们公司正试图避免将密码和其他敏感数据存储在我们的git repo中。
我知道您可以通过.htaccess
文件轻松创建环境变量,但我希望找到一个可行的解决方案,使我能够从环境变量中动态设置此数据库信息。
由于local.xml
是一个XML文件,因为这是一个非动态/服务器端文件类型,我们不能用它来读取环境变量。
是否有办法以某种方式向Magento添加一些钩子/自定义行为,我可以在其中用可以让我引入这些环境变量的PHP文件替换local.xml
?
从某种意义上说,local.XML
将成为local.PHP
文件,能够读取我自己的自定义环境变量DB_HOST, DB_USERNAME, DB_PASSWORD
,而不是将它们设置在xml文件中localhost, root, password123
等。
关于如何最好地实现这一点的任何想法,或者是否有任何现有的Magento附加组件/扩展/ mod可以让我这样做?
答案 0 :(得分:4)
我建议git忽略你的local.xml并使用你的部署脚本动态创建它。您的部署脚本应该包含敏感数据变量。
答案 1 :(得分:3)
我找到了解决问题的替代方案。我扩展了Mage_Core_Model_Config_Element并覆盖了' xmlentities'函数检查它返回的配置值是否以美元符号开头,如果是,则将其替换为等效的环境变量。
如果它对其他人有帮助,那么它就是......
答案 2 :(得分:1)
请尝试此解决方案:
将app / code / core / Mage / Core / Model / App.php复制到app / code / local / Mage / Core / Model / App.php并用以下方法替换_initBaseConfig()方法:
protected function _initBaseConfig()
{
Varien_Profiler::start('mage::app::init::system_config');
$this->_config->loadBase();
/* Read DB connection config from environment variables */
$connection = $this->_config->getNode('global/resources/default_setup/connection');
$connection->setNode('host', $_ENV['DB_HOST']);
$connection->setNode('username', $_ENV['DB_USERNAME']);
$connection->setNode('password', $_ENV['DB_PASSWORD']);
Varien_Profiler::stop('mage::app::init::system_config');
return $this;
}
这一定有帮助。
* 编辑
protected function _initBaseConfig()
{
Varien_Profiler::start('mage::app::init::system_config');
$this->_config->loadBase();
/* Read DB connection config from environment variables */
$this->_config->getNode('global/resources/default_setup/connection')
->setNode('host', $_ENV['DB_HOST'])
->setNode('username', $_ENV['DB_USERNAME'])
->setNode('password', $_ENV['DB_PASSWORD']);
Varien_Profiler::stop('mage::app::init::system_config');
return $this;
}
答案 3 :(得分:0)
您是否考虑过将local.xml
添加到.gitignore
并在部署过程中创建/更新它?请注意,local.xml
通常不仅存储数据库凭据。例如,它还可以将缓存后端的配置存储为会话存储。这些通常也是服务器特定的,如果你试图避免使用local.xml
,会使事情变得非常混乱。