2

オブザーバーの関数の 1 つに問題があります。何らかの理由で、さらに操作するために顧客情報を読み込めません

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

私がチェックしたところ、 $user->getId() は実際にIDを持っています。ただし、たとえば、次のようにします。

$password = $usertemp->getPassword(); 

ユーザーのパスワードの代わりに null 値が設定されます。

4

1 に答える 1

3

customerまず第一に -からすでにオブジェクトを持っているのに、なぜオブジェクトをロードするの$observer->getEvent()->getCustomer()ですか? この操作はここでは過剰であり、リソースと時間がかかるだけです。

2 つ目 - セキュリティ対策のため、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のハッシュが、md5 にあるはずなのになぜでしょうか0f474c41fd20617eb8f1a0cb9b08f3aa:Uhe10adc3949ba59abbe56e057f20f883e答えは -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モデル内のこれらの 2 つのメソッド:

    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の両方が設定されていることがわかります。唯一の違いは、実際には既存の属性ではないことです。つまり、DB やその他の場所には保存されず、オブジェクトがメモリから消去されるとすぐに失われます。passwordpasswordpassword$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 に答える