Magento加载客户数据不起作用

时间:2012-10-16 21:24:22

标签: magento load observers

我的一个观察者的功能有问题。 出于某种原因,我无法加载客户信息以进行进一步操作

$user = $observer->getEvent()->getCustomer();
$usertemp = Mage::getModel('customer/customer')->load($user->getId());  

我检查过,$ user-> getId()实际上带有id;但是,当我尝试时,例如:

$password = $usertemp->getPassword(); 

设置空值而不是用户密码。

1 个答案:

答案 0 :(得分:3)

首先 - 如果你已经有customer的对象,为什么要加载$observer->getEvent()->getCustomer()个对象?这里的操作过多,只会增加资源和时间。

第二 - 对于安全措施,Magento不以解密形式存储用户密码。如果您想获取用户密码,请尝试下一个代码:

$passwHash = $customer->getPasswordHash();
$password = Mage::helper('core')->decrypt($passwHash); // this will not work

更新Mage::helper('core')->decrypt不会解密密码哈希,因为它是使用md5哈希函数进行哈希处理的,因此有一种方法可以检查密码是否相同(Mage::helper('core')->validateHash) ,但您无法检索原始密码。

更新2 :所以提问者有一些有趣的问题,他在评论中提到了这些问题,我将在这里解答:

  1. 为什么 123456 的哈希值为0f474c41fd20617eb8f1a0cb9b08f3aa:Uh,而md5中的哈希值应为e10adc3949ba59abbe56e057f20f883e。答案是 - 因为hash方法不仅散列输入密码,还散乱随机生成的盐。看看这个方法:

    public function getHash($password, $salt = false)
    {
        if (is_integer($salt)) {
            $salt = $this->_helper->getRandomString($salt);
        }
        return $salt === false ? $this->hash($password) : $this->hash($salt . $password) . ':' . $salt;
    }
    

    Customer模型中的这两种方法:

    public function setPassword($password)
    {
        $this->setData('password', $password);
        $this->setPasswordHash($this->hashPassword($password));
        return $this;
    }
    public function hashPassword($password, $salt = null)
    {
        return Mage::helper('core')->getHash($password, !is_null($salt) ? $salt : 2);
    }
    

    因为$salt参数是整数(2),实际的盐是随机生成的字符串。这就是为什么你有不同的输出哈希值,而不是简单的md5($passw)

  2.   

    我也直接使用getPassword(),因为它正在处理用户注册

    这有点容易。在registering进程中,您有一个带有原始密码的$_POST数据。在$customer->setPassword($passw)的帮助下,您将其设置为$customer模型。如果您查看上面的此函数,您会看到在此操作期间设置了passwordpassword哈希属性。唯一的区别是:password实际上不是现有属性,这意味着它不会存储在数据库或其他任何地方,只要$customer对象被清除就会丢失来自记忆。

  3. 无法在Magento中获取用户密码。您唯一能做的就是将给定密码与现有password_hash进行比较(如前所述):Mage_Core_Helper_Data::validateHash

    public function validateHash($password, $hash)
    {
        $hashArr = explode(':', $hash);
        switch (count($hashArr)) {
            case 1:
                return $this->hash($password) === $hash;
            case 2:
                return $this->hash($hashArr[1] . $password) === $hashArr[0];
        }
        Mage::throwException('Invalid hash.');
    }