22 Feb 2014

[CakePHP]hashing password パスワードのハッシュ化

CakePHP2系 ( $version < 2.3 ) のお話

すべからくパスワードはDB保存時にハッシュ化されるべきですが、
http://book.cakephp.org/2.0/ja/tutorials-and-examples/blog-auth-example/auth.html
を参考にUserモデルのファイルに、

 // hashing password
public function beforeSave($options = array()) {
    $this->data['User']['password'] = AuthComponent::password($this->data['User']['password']);
    return true;
}
と、ルーチンを追加して、保存時にハッシュ化されるように設定。
このままだと、passwordフィールドを含まない更新でエラーが発生するので、
下記のように書き換える。

// hashing password
public function beforeSave($options = array()) {
    if ( isset ( $this->data['User']['password'] ) ) {
        $this->data['User']['password'] = AuthComponent::password($this->data['User']['password']);
    }
    return true;
}
こうすれば、パスワードに触れずに、その他のフィールドをeditする事が可能。

2.4以降では、ハッシュ化もモジュールを通じて行われるようです。上記問題も対応済です。

http://book.cakephp.org/2.0/ja/tutorials-and-examples/blog-auth-example/auth.html

public function beforeSave($options = array()) {
    if (isset($this->data[$this->alias]['password'])) {
        $passwordHasher = new SimplePasswordHasher();
        $this->data[$this->alias]['password'] = $passwordHasher->hash($this->data[$this->alias]['password']);
    }
    return true;
}