さて,昨日,passwordHasher を使って「解決した」と書きましたが,色々運用試験してみると,全く解決していないことが分かりました。

そこで,現在,SimplePasswordHasher ではなく,BlowfishPasswordHasher を使うことで対応しています。

具体的には,次の通りです。

1)Controller にて明示

AppController.phpにて,BlowfishPasswordHasherを使うことを明示します。つまり,class を宣言する前に次の行を入れます。

App::uses('BlowfishPasswordHasher', 'Controller/Component/Auth');

そして,AuthComponent が BlowfishPasswordHasher を使うように設定します。

public $components = [
      'Auth' => [
        'authenticate' => [
          'Form' => [
            'passwordHasher' => 'Blowfish',
          ],
        ],
      ],
      'Session',
    ];

Auth の下には,loginAction や,loginRedirectなど色々設定すべきプロパティがありますが,今回は割愛。

とにかく,Form で passwordHasher に Blowfish を使うと明示。

また,前回の記事で,コントローラー内部のパスワードの保存時に,直にPasswordHasher を使って暗号化し,保存していた部分は全て削除
受けとったデータをそのまま,保存するようにします。

暗号化は次の2)Model 側の,beforeSave を用います。
(昨日は,使わない・・・って書いたのに)

2)Model で明示

昨日の記事では,BeforeSave なんぞ使わないとしましたが,使います。

パスワードを保管するModel,例えば User.php にて,classの宣言前に,次のように明示。

App::uses('BlowfishPasswordHasher', 'Controller/Component/Auth');

そして,class の中で,beforeSave 関数を設定。

public function beforeSave($options = []) {
  // パスワードの暗号化
  if (!empty($this->data[$this->alias]['password'])) {
      $passwordHasher = new BlowfishPasswordHasher();
      $this->data[$this->alias]['password'] = $passwordHasher->hash(
        $this->data[$this->alias]['password']
      );
  }
  return true;
}

これでどうでしょうか。

前回,CakePHP2.x系で大丈夫じゃわい!

と書きましたが,今回のように,公式チュートリアルどおりにやって動かないときに,ちょっと不安になってきますね。
マイナーバージョンは更新され続けているとはいえ,メジャーアップデートは4までいっちゃいましたからね・・・。切り捨てられているような雰囲気もじゅうぶんに感じます。

うーん,今後は,CakePHP4系に乗り換えた方がよいのかな。

もしくは,Laravel
フレームワークなので,学習コストが低ければ,CakeでもLaravelでも良いのですが。Ruby on Rails は,別にRails サーバー立てないとダメなので,レンタルサーバーだと厳しいですね。いちいち,Herokuとか使わないといけないのは,避けたい・・・。

 一覧ページへもどる