ログインしたユーザーがアカウント設定(メールアドレスとパスワード)を変更するためのフォームを作成しています。これを行うには、現在のパスワードを確認できる必要があります。これは私が私のフォームを構築する方法ですsettings.ctp
:
<div id="content-complex-image">
<div id="sidebar">
<ul>
<li><a href="/account/images">Your images</a></li>
<li><a href="/account/settings">Account settings</a></li>
</ul>
</div>
<div id="content-inner">
<p>Modify your account settings</p>
<?php echo $this->Session->flash(); ?>
<?php
echo $this->Form->create('User');
echo $this->Form->input('currentPassword', array('type' => 'password'));
echo $this->Form->input('username', array('disabled' => 'disabled', 'value' => $username));
echo $this->Form->input('email');
echo $this->Form->input('password', array('type' => 'password'));
echo $this->Form->end('Update');
?>
</div>
<div class="clear"></div>
</div>
これが私のコントローラーのアクションです:
public function settings() {
$this->set('title_for_layout', 'Account Settings');
$this->User->id = $this->Auth->user('id');
if ($this->request->is('post')) {
if($this->Auth->user('password') == $this->request->data['User']['currentPassword']) {
if ($this->User->save($this->request->data)) {
$this->Session->setFlash('Your details have been saved');
$this->redirect(array('action' => 'settings'));
} else {
$this->Session->setFlash('Your details could not be updated. Try again.');
}
} else {
$this->Session->setFlash('Invalid password. Try again.');
}
}
}
ただし、if()
for a password checkは常にfalseと評価され、常に「invalidpassword」メッセージが表示されます。パスワードを正しくチェックしていないと思いますが、正しい方法がわかりません。
また、ユーザーがユーザー名を変更できないようにしたいと思います。フォームフィールドを無効に設定したことは知っていますが、ユーザーが設定アクションに投稿リクエストを送信すると、ユーザー名が変更される可能性があります。ユーザー名が更新されないようにするにはどうすればよい$this->User->save()
ですか?
編集:2つの問題のように見えます。1つは比較前にパスワードをハッシュしていなかった、2つ$this->Auth->user('password')
は実際にはNULLです。これは別の問題を提起します、それを比較するためにデータベースからユーザーにハッシュされたパスワードを取得するにはどうすればよいですか?