首先-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
应该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)
.
我也直接使用 getPassword() 因为它正在处理用户注册
这更容易一些。在此registering
过程中,您有一个$_POST
带有原始密码的数据。在您的帮助下$customer->setPassword($passw)
将其设置为$customer
模型。如果您查看上面的此函数,您会看到在此操作期间同时设置了password
和password
hash 属性。唯一的区别: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.');
}