CakePHP3でミューテーターを使ってパスワードをハッシュ化する方法

184 回閲覧されました

みなさんこんにちは、jonioです。

今回の記事はCakePHP3でパスワードをハッシュ化するメモです。

CakePHPのバージョン

3.6.15です。

モデルに記述

usersテーブルのpasswordカラムの値をハッシュ化したいので「CakePHPのプロジェクト > src > Model > Entity > User.php」に記述します。

<?php
namespace App\Model\Entity;

use Cake\ORM\Entity;
use Cake\Auth\DefaultPasswordHasher;           //この行を追加

/**
 * User Entity
 *
 * @property int $id
 * @property string $name
 * @property string $email
 * @property string $password
 * @property \Cake\I18n\FrozenTime $created
 * @property \Cake\I18n\FrozenTime $modified
 */
class User extends Entity
{


    //ここから追加
    protected function _setPassword($password)
    {
        return (new DefaultPasswordHasher)->hash($password);
    }
    //ここまで追加

22行目に「_setPassword」メソッドがありますがusersテーブルのpasswordカラムの値を変更する時にしか使えないのでメソッドの命名方法について説明します。

_set

まずは「_setPassword」の「_set」の意味から説明します。

これはミューテーターと呼ばれていてデータを保存する前にテーブルに登録する値を変更することができます。

今回はミューテーターの中にパスワードをハッシュ化する処理を入れています。

Password

次は「_setPassword」の「Password」について説明します。

命名は変更する値が入るカラム名の先頭を大文字にして書きます。

今回Passwordカラムの値を変更するので「Password」です。

もし「user_password」カラムの値を変更するなら「UserPassword」という感じで名称をつけます。

またコードの22行目・24行目の「$password」は「$カラム名」にしないといけないルールがあります。

これでパスワードのハッシュ化ができます。

beforeSaveメソッド

これでやることも可能です。

public function beforeSave(Event $event, Entity $entity, ArrayObject $options)
{
  if ($entity->isDirty('カラム名')) {
    $hasher = new DefaultPasswordHasher();
    $entity->admin_password = $hasher->hash($entity->admin_password);
  }
}

ただこのやり方をするとコントローラーでの全ての登録や編集で動作するので動作範囲が広すぎで使わない方がいいと思います。