こんにちは、Cakephp3でログインできるシステムを作っています。
ログインしていない状態で、顧客番号とログインIDと現在パスワード、新しいパスワードを入れることでパスワードを更新させる機能を実装したいです。利用者登録するとランダムでパスワードが発行され、メールでお知らせする仕組みなのでログインなしでもパスワードが変更できるようにしたいです。
認証はCakephp3のAuthを利用して作り、問題なく動いています。
そこで、ページからPOSTで入力されたデータを利用し、DBに暗号化されたパスワードと一致するかを比較し、一致した場合は利用者が入力した新パスワードで更新する機能を作りたくて以下のようにコードを作ってみましたが、エラーが出てしまいました。
php
1 //UsersController.phpの中 2 3public function change() 4 { 5 6 if ($this->request->is('post')) 7 { 8 9 $salt_key = '//システムの基本値64Bitのコードを入れました。'; 10 11 $customer_no = $this->request->data['customer_no']; 12 $user_id = $this->request->data['user_id']; 13 $password_now = $this->request->data['password_now']; 14 $password_new = $this->request->data['password_new']; 15 $password_check = $this->request->data['password_check']; 16 17 $user = $this->Users->find()->where(['customer_no' => $customer_no]) 18 ->andWhere(['user_id' => $user_id]); 19 20 $pwd = $user->password; // エラー: Undefined property: Cake\ORM\Query::$password 21 $password = Security::decrypt($pwd,$salt_key); 22 23 if ($password === $password_now) 24 { 25 26 if($password_new === $password_check) 27 { 28 $user->password = Security::hash($password_new,$salt_key); 29 $user->modifier = $user_id; 30 $this->Users->save($user); 31 32 $this->Flash->success(__('Success to change password, plz login with new password.')); 33 return $this->redirect(['action' => 'login']); 34 } 35 else { 36 $this->Flash->error(__('Failed to change password, plz check your informaion.')); 37 } 38 39 } 40 } 41 }
$passwordという変数が定義されてないと出るし、Decryptもそれでうまく動いてなさそうです。そもそも、Hash化されてDBにあるパスワードをこのように無理やり読み込んで復号化し、POSTデータと比較してまた暗号化するというやり方が正しいか?という疑問もあります。
また、ControllerとModel(UsersTable.php)に分けてコードを書く必要があるか?と思っていますが…データベースに接続してパスワードの一致を確認する処理は、コントローラーではなくてModelか、Entityですることかな?とかのもやもや感があります。
何かアドバイスや参考できることがあればぜひお願いしたいです。
どうぞよろしくお願いいたします。
回答3件
あなたの回答
tips
プレビュー