CakePHP3.8でパスワードをハッシュ化したい
パスワードのハッシュ化って超大事ですよね。
セキュリティの基本のキと言ってもいいのではないでしょうか。
今回はCakePHP3.8でパスワードをハッシュ化する方法を説明します。
【自分の環境】
macOS Catalina
PHP7.4.2
CakePHP3.8
MAMP5.7
Apache2.2
MySQL5.7
User.php(エンティティ)をいじる
Usersテーブルというテーブルを作成している前提ですが、User.php(エンティティ)をいじることで再現できます。
ディレクトリ的にはsrc/Model/Entity/User.phpみたいなかんじですね。
最初から何かしら記述してありますが、以下のように設定します。
<?php namespace App\Model\Entity; use Cake\ORM\Entity; use Cake\Auth\DefaultPasswordHasher; // ここを追加。 (中略) class User extends Entity { protected $_accessible = [ 'name' => true, 'mail' => true, 'pass' => true, ]; protected $_hidden = [ 'pass', ]; // この辺を追加。 protected function _setPass($pass){ return (new DefaultPasswordHasher)->hash($pass); } // この辺を追加。 }
上記のように、
①use Cake\Auth\DefaultPasswordHasher;
②protected $_hidden = ['pass'];
③protected function _setPass($pass){
return (new DefaultPasswordHasher)->hash($pass);
}
この3つを追加します。
自分の場合はカラム名を「pass」にしているので、上記のようになっています。
「password」となっている方もいると思います。
これでこの記述以降のデータベースに保存される値を見てみると、ハッシュ化されていると思います。
おまけ
パスワードを入力する時に文字が全部「********」みたいに化けるやつありますよね。
マスキングとか伏せ字にするとか言うらしいです。
これを付けたいときは、表示用であるビューテンプレートをいじります。
普通の入力フォームは
<p>パスワード</p> <?= $this->Form->text('pass') ?>
みたいになっていると思います。
この時、Formヘルパーでcontrollメソッドを使っていて、かつ、カラム名がpasswordだと勝手にマスキングされるみたいです。
ただ自分の場合はFormヘルパーでtextメソッドを使い、さらにカラム名がpassなので、マスキングされません。
こういう場合は以下のようにします。
<p>パスワード</p> <?= $this->Form->text('pass',['type'=>'password']) ?>
ご覧のようにメソッドの第2引数に['type'=>'password']を入れています。
これでマスキングされるようになります。
マスキングには賛否両論あるみたいなので、付けても付けなくてもいいみたいですが…。
終わりに
以上となります。
パスワードの扱いは非常に慎重にならなければならないので、手軽にハッシュ化できるこの機能はありがたいですね。
ありがとうございました。