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']を入れています。

これでマスキングされるようになります。

マスキングには賛否両論あるみたいなので、付けても付けなくてもいいみたいですが…。

終わりに

以上となります。

パスワードの扱いは非常に慎重にならなければならないので、手軽にハッシュ化できるこの機能はありがたいですね。

ありがとうございました。