前回、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] ざっくりとフォーム認証