読者です 読者をやめる 読者になる 読者になる

【CakePHP】BlowfishPasswordHasherで作成したハッシュパスと入力された平文パスが一致するか調べる

ログイン等の処理の場合は、明示的にパスの一致を調べる必要はないけれども、ユーザが後からパスワードの変更なんかをする場合は、viewで入力されたパスとDB内のハッシュ化されたパスの一致を調べる処理が必要になる。
このような場合は、BlowfishPasswordHasherのcheckメソッドを使って、一致の検証を行うことが出来る。

一致の調べ方で地味に詰まったのでメモ。

とりあえず、ユーザの現在パスはhogeだとし、ユーザIDはAuthから取ってくる。
また、$this->request->data['old_pass']には、viewから入力されたパスが入っているとする。

<?php
//UsersController.php
public function checkPassword() {
    $passwordHasher = new BlowfishPasswordHasher();
    $current_pass = $this->User->getPasswordById($this->Auth->user('id'));
    //パスワードの正誤判定
    if ($passwordHasher->check($this->request->data['old_pass'], $current_pass)) {
        //パスが正しい場合の処理
    } else {
        //パスが正しくない場合の処理
    }
}
<?php
//User.php
//該当ユーザのハッシュ化されたパスワードを返す
public function getPasswordById($id) {
    $user = $this->find('first', array(
        'conditions' => array('User.id' => $id),
        'fields' => 'password'
    ));
    return $user['User']['password'];
}

viewでhogeと入力されていれば正しい場合の処理が、piyoと入力されていれば正しくない場合の処理が実行される。
本来は判定の処理はModelに書くべきだと思われるけど、スペースの都合上コントローラに書いた。

ブログにコード書くのってむずいですね……。


参考
Class BlowfishPasswordHasher | CakePHP