前回、CakePHP3をインストールして、おためにしにユーザー管理を作ったが、パスワードが丸見えだった。
なので、次はパスワードの暗号化を行う。
まず、ModelのEntityのUser.phpを開く。
んで、クラス上部にuse句で、パスワードをハッシュ化するクラスのnamespaceを追加。
namespace App\Model\Entity; use Cake\Auth\DefaultPasswordHasher; //これを追加 use Cake\ORM\Entity;
なんだか、C#な感じになったな~。
use でクラスを指定するから、NetBeans君でコード補完が気持ちいい。
C#で書くと、こんな感じかな。
using Cake.Auth.DefaultPasswordHasher;
using Cake.ORM.Entity;
namespace App.Model.Entity{
class User : Entity{
....
}
}
脱線した。
んで、以下のメソッドを追加する。
/**
* パスワードセッター passwordに値をセットするときハッシュ化する。
* @param type $value
* @return type
*/
protected function _setPassword($value)
{
$hasher = new DefaultPasswordHasher();
return $hasher->hash($value);
}
上記は、passwordというカラム名をセットする際に、このセッターを通り、$valueにある値をハッシュクラスでハッシュ化した値を戻すことで、saveされる際に、結果的にその暗号化された値が保存される。
これは、CakePHP3でセッター(Setter)と呼ばれる機能で、命名規則に基づいているカラム名をCameCaseで紐付けて、データをセットする際に加工するっぽい。
中身ちらっと追いかけたら、それっぽい所があった。
$setter = '_set' . Inflector::camelize($p);
if ($this->_methodExists($setter)) {
$value = $this->{$setter}($value);
}
$this->_properties[$p] = $value;
これで、試しに別のユーザーを作成したら、ちゃんとパスワードはハッシュ化されていた。
ワードラップが働いて、はみ出しまくってるけど(^^;)
似たような感じで、$method = ‘_get’ . Inflector::camelize($property); という記述を見かけたので、ゲッター(Getter)もあるなと思い、下記のようなメソッドを追加。
protected function _getId($value)
{
$value = $value * 100;
return $value;
}
読み込みなおしてみると、下記のようにidがすべて100倍されるようになった。

以上、CakePHP3のゲッター(Getter)とセッター(Setter)なお話。
パスワードのハッシュ化もできたので、次はFormでユーザー認証してみる。 >> [CakePHP3] ざっくりとフォーム認証
