2

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

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

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

$password = $usertemp->getPassword(); 

设置了一个空值而不是用户的密码。

4

1 回答 1

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应该e10adc3949ba59abbe56e057f20f883e在 md5 中。答案是 - 因为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模型。如果您查看上面的此函数,您会看到在此操作期间同时设置了passwordpasswordhash 属性。唯一的区别:password它不是真正的现有属性,这意味着它不会存储在数据库或其他任何地方,并且一旦$customer从内存中清除对象,它就会丢失。

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.');
}
于 2012-10-16T21:33:26.403 回答