我的一个观察者的功能有问题。 出于某种原因,我无法加载客户信息以进行进一步操作
$user = $observer->getEvent()->getCustomer();
$usertemp = Mage::getModel('customer/customer')->load($user->getId());
我检查过,$ user-> getId()实际上带有id;但是,当我尝试时,例如:
$password = $usertemp->getPassword();
设置空值而不是用户密码。
答案 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 :所以提问者有一些有趣的问题,他在评论中提到了这些问题,我将在这里解答:
为什么 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)
。
我也直接使用getPassword(),因为它正在处理用户注册
这有点容易。在registering
进程中,您有一个带有原始密码的$_POST
数据。在$customer->setPassword($passw)
的帮助下,您将其设置为$customer
模型。如果您查看上面的此函数,您会看到在此操作期间设置了password
和password
哈希属性。唯一的区别是: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.');
}