2012-06-22 25 views
2

很好理解设置系统配置字段的默认值(通过来自@alan storm的Chapagainblog post),但密码字段不同,因为它们在保存到数据库时被加密。因此,当Magento从config.xml中读取默认值时,它会尝试解密该值,如果默认值是纯文本,则会失败。在Magento系统配置中设置密码字段的默认值

是否存在一个XML帮助器或进程(除了创建一个安装脚本到$setup->setConfigData('config/path/here', md5('default')))来指定这些默认设置?

回答

2

这是一个有趣的问题/思想实验,但目前的行为似乎是合理的。如果某个值的数据存储需要加密,无论是在config.xml还是在安装/升级脚本中,我都无法想象它适合以文本系统中任何位置的纯文本形式显示函数值。

唯一的另一个选择是自己加密,这可能是不可取的,因为您必须发布并因此了解crypt密钥值。

3

我不是100%肯定(这是一个快速grep),但我认为密码加密发生在

File: app/code/core/Mage/Adminhtml/Model/System/Config/Backend/Encrypted.php 
protected function _beforeSave() 
{ 
    $value = (string)$this->getValue(); 
    // don't change value, if an obscured value came 
    if (preg_match('/^\*+$/', $this->getValue())) { 
     $value = $this->getOldValue(); 
    } 
    if (!empty($value) && ($encrypted = Mage::helper('core')->encrypt($value))) { 
     $this->setValue($encrypted); 
    } 
} 

请记住,这是一个加密,不散列。由于您要存储密码以便在某个地方使用(最常见的是支付API),因此Magento需要能够解密已被炒作的内容。因此,您可以使用核心帮助程序的encrypt方法生成这些值。你也可以尝试这样的事情

$o = Mage::getModel('adminhtml/system_config_backend_encrypted'); 
$o->setData('value','encrypted or unencrypted value'); 

$o->beforeSave();  //to encrypt the value 

$o->afterLoad();  //to unencrypted the value 

$password = $o->getValue(); //fetch the value 

只要记住,每个店铺都有自己的加密密钥,所以这不会是分发模块非常有用。

您还应该在​​3210加载和处理中查看backend_model属性(自我链接免责声明,未在互联网上的任何其他地方记录)。

希望有所帮助。

+1

TIL有一个_afterLoad的公共包装器...不幸的是不是_beforeSave的情况,虽然:) –