在yii2中更新后端的密码

时间:2016-02-10 16:42:01

标签: passwords yii2 yii2-advanced-app password-hash

我在Yii2 Advanced-后端做了CRUD。我使用了类扩展ActiveRecord。我有一个密码属性的问题,当我想要更新它显示带有很多点的散列密码时,当我尝试更新它时不保存散列密码。所以我使用beforeSave来哈希密码:

public function beforeSave($insert)
{
    if (parent::beforeSave($insert)) {
        if($this->isNewRecord) {
            $this->created_at = time();
            $this->status = self::DEFAULT_STATUS;
            $this->generateAuthKey();
            $this->setPassword($this->PasswordHash);
            $this->RulesAccept=1;
            return true;
        } else {
            $this->setPassword($this->PasswordHash);
            return true;
        }
    } 
}

我不知道如何在显示更新表单时这样做,它会显示哈希密码的点数,如果您不更改密码,也不会更改。目前,每次单击“更新”时,我的密码都会更改或重新散列。我怎么能避免这种情况。我尝试在这样的形式中使用空值:

<label class="control-label"> <?= Yii::t('app', 'Hasło')?> </label>
<?= $form->field($model, 'PasswordHash')->passwordInput(['placeholder' => Yii::t('app', 'Utwórz hasło'), 'value' => ''])->label('') ?>

然后我尝试检查我的beforeSave(),如果输入表单为空,则不保存此密码,只需将其保留在数据库中:

public function beforeSave($insert)
{
    if (parent::beforeSave($insert)) {
        if($this->isNewRecord) {
            $this->created_at = time();
            $this->status = self::DEFAULT_STATUS;
            $this->generateAuthKey();
            $this->setPassword($this->PasswordHash);
            $this->RulesAccept = 1;
            return true;
        } else {
            if((!empty)$this->PasswordHash)){
                $this->setPassword($this->PasswordHash);
                return true;
            }
            return false;
        }
    } 
}

因此,当我以更新的形式出现时,我会看到空输入的密码。如果我不写新的密码,它只会更改我更改的所有属性,但如果我写了一些密码,它会保存我这个新密码。我认为这个功能应该工作,但我错了,这种形式总是改变密码。我该怎么做才能解决这个问题。也许有其他方式?

1 个答案:

答案 0 :(得分:1)

你可以使用$ this-&gt; isAttributeChanged(&#39; password_field&#39;)

public function beforeSave($insert)
{
    if (parent::beforeSave($insert)) {
        if ($this->isAttributeChanged('PasswordHash')) {
            $this->setPassword($this->PasswordHash);
        }
        return true;
    } else {
        return false;
    }
}