PHPのRuby on Railsクローンのフレームワーク Akelos PHPをいじってみた出来事のメモ。

Akelosをいじってみるメモ帳

Akelos PHP Blogチュートリアル一覧(全18記事)
Akelos PHP ユーザ認証チュートリアル一覧(全19記事)

2008年09月02日

Akelosユーザ認証チュートリアル 5.Userモデルをちゃんと その3 beforeCreate/beforeUpdate

続いてパスワードを保存する時に暗号化する処理です。
いくつかのところで実装する方法があるのですが、今回はbeforeCreate()とbeforeUpdate()を使ってみます。
※Rubyなら演算子の再定義(オーバーロード)が、一番スマートなんだろうけどPHPは出来ないんですよねー

ということで、下記のようなコードをvalidateメソッドの後ろに足します。


//データが新規保存される前に呼び出される callback methodです。
//中でパスワードとsaltをセットしています。
function beforeCreate()
{
//パスワードの暗号化関数を呼び出す
$this->encryptPassword();

return true;
}

//データが修正保存される前に呼び出されるcallback methodです。
function beforeUpdate()
{
//パスワードの暗号化関数を呼び出す
$this->_encryptPasswordUnlessEmptyOrUnchanged();
return true;
}


encryptPassword()関数と、_encryptPasswordUnlessEmptyOrUnchanged()関数は後で説明します。

とりあえず、beforeCreateとbeforeUpdateについて。これらはActiveRecordに組み込まれているコールバックメソッドです。コールバックメソッドとは、特定のタイミング(トリガー)で自動的に呼び出される場所のことを言います。フックとか、イベントとかって表現をしているフレームワークもありますね。まぁ、どれも似たようなもんです。

ここで指定している2つは以下の意味があります。
beforeCreate 新しいレコードを保存する前に呼び出される
beforeUpdate レコードを更新・修正する前に呼び出される
です。

これらの前にvalidateもコールバックメソッドとして呼び出されています。
これらの呼び出し順は、決まっていて、その他にもいくつかメソッドがあるんですが、それぞれの説明は今回は割愛
function beforeCreate()
function beforeValidation()
function beforeValidationOnCreate()
function beforeValidationOnUpdate()
function beforeSave()
function beforeUpdate()
function afterUpdate()
function afterValidation()
function afterValidationOnCreate()
function afterValidationOnUpdate()
function afterCreate()
function afterDestroy()
function beforeDestroy()
function afterSave()
とりあえず、こんな種類があると思って下さい。意味は名前でだいたいわかるかと思います。

ひとつ、これらのコールバックでは return true; で返して下さい。returnを返さない or return false;は処理が中断する場合があります。逆に内容によって処理を中断したい場合もあるでしょうけど。

さて、話は戻って、beforeCreateとbeforeUpdateの中は、それぞれ別のユーザ定義のメソッドを呼んでいるだけです。それぞれのメソッドをさらに書き加える必要があります。

下記のようなコードをさらに、クラス内に足して下さい。


//パスワードが修正されている場合だけ暗号化保存をする関数です。
function _encryptPasswordUnlessEmptyOrUnchanged() {
//修正対象のIDの保存されているデータ(つまり旧データ)を呼び出す。
$u =& $this->find($this->id);

//ユーザからのリクエストのpasswdを確認する
switch($this->get('passwd')) {
case '': //空の場合は、保存されてるデータを入れる
$this->set('passwd',$u->passwd);
break;
case $u->passwd: //同じパスワードならばそのまま。
break;
default: //その他の場合はパスワードの修正
$this->encryptPassword();
break;
}

return true;
}


//パスワードを暗号化する関数です。
function encryptPassword()
{
//saltをセットします。
// Akクラスには便利な関数がいくつかあります。
// Ak::randomString() はランダム文字列を得ることが出来ます。
$my_salt = Ak::randomString(8);
$this->set('salt',$my_salt);

//passwdをセットします。
// encryptPassword関数に渡して暗号化してもらいます。
$this->set('passwd', $this->_myEncrypt($this->get('passwd'),$my_salt));
}

//暗号化関数です。
function _myEncrypt($pass,$salt)
{
//sha1で文字列を暗号化しています。
//暗号化文字列は関数引数のsalt+クラス内の固定saltを足しています
return sha1($pass . $this->_my_common_salt . $salt);
}

それぞれの細かい処理はコード内のコメントを参照してください。

よく使うのは $this->set() や$this->get() あたりぐらいでしょうか。
ここではbeforeCreateとbeforeUpdateの前、つまりDBに保存される前に、データを書き換えたり、加えたりしているわけです。
ここではsaltを作ってsetしたり、passwdを暗号化して書き換えたりしていますね
beforeCreateやbeforeUpdateから呼び出される流れを追って確認すると良いと思います。
posted by AMUAMU at 03:45| Comment(0) | TrackBack(0) | チュートリアル | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/105875619

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。