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

Akelosをいじってみるメモ帳

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

2008年09月02日

Akelosユーザ認証チュートリアル 6.Userモデルをちゃんと その4 その他関係するメソッド実装

本来、モデルには細かい挙動を実装すべきではないですが、ログインするときに認証する方法と、パスワードをユーザが紛失したときに再発行する仕組みは必要となります。

複雑なシステムの場合は、ここらへんの仕組みは別の認証用クラスとかにまとめる場合もありますが、今回は取りあえずUserモデルに入れてしまいます。

モデルでしか基本的に知らないこと、もしくはモデル以外には教えたくない事を書いています。ここでは、パスワードの暗号化に関する部分を秘匿したい(共通化したい)ので入れます。

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

//新しいパスワードを自動生成してセット、保存する関数
//返値には新しいパスワード文(平文)が返される。
function new_password()
{
//新しいパスワードを自動生成(ランダム)8文字の文字列
$new_pass = Ak::randomString(8);

//新しいpassをセット パスワードは平文のまま
$this->set('passwd',$new_pass);

//こっちもセットしないとvalidateで蹴られるんです
$this->set('passwd_confirmation',$new_pass);

//修正した内容で保存。
//なおこの後、beforeUpdateが呼ばれて、平文は暗号化される
if($this->save()) //保存が成功したら新しいパスを返す
return $new_pass;
else
return false;
}

//認証確認用関数
function auth($email,$pass)
{

//emailが一致する行を取り出す、成功すればこのモデルにも反映される
$u =& $this->findFirstBy('is_enable AND email' ,'1',@$email);

//見つからなければ$uはfalseが入る。
if(empty($u)) return false;

//見つかった行のパスワードと、入力されたパスワードの一致確認
//保存されているsaltで暗号化してみて、取り出した行と比較
if($this->_myEncrypt($pass,$u->salt) == $u->passwd){

//管理者権限確認と、フラグを立てる
if( array_search($email,$u->_admin_email) !== FALSE ){
$u->is_admin = true;
}else{
$u->is_admin = false;
}

$result = $u;
} else {
$result = false;
}
return $result;
}

これらの関数は、モデルを使うコントローラ側から呼び出される事が想定しています。

よく使うもので新しいメソッドはfindFirstBy()でしょうか。
ルールを指定して、データをDBから探してきてくれます。
emailと指定しているものは、$email変数との一致を見るクエリに自動的に代入されます。あわせてANDでis_enable はtrueであるかどうかを確認させています。
ちなみに@$emailという表現は、関数実行のエラー表示抑制をしてくれるものです。おまじないみたいなもんだと思って下さい。あまりこの@演算子は説明が無いようですが・・・

管理者権限は配列をなめて(array_search)、一致する場合のみadminフラグを立てる単純な処理です。
レベル管理するように改変する場合はここら辺が修正しどころですね。
posted by AMUAMU at 03:52| Comment(0) | TrackBack(0) | チュートリアル | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

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


※画像の中の文字を半角で入力してください。

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

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