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

Akelosをいじってみるメモ帳

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

2008年09月02日

Akelosユーザ認証チュートリアル 7.Userモデルの確認 完成したUserモデル

ということで、Userモデルが完成しました。念のため、コードの全体を出します。
本当は、ここでテストとかするのかなぁー・・・。まぁ、今回は割愛w


<?php

class User extends ActiveRecord
{
//クラス内の共通暗号化キーです
var $_my_common_salt = 'my_common_pass';

//管理者かどうかのフラグです。
var $is_admin = false;

//管理者として設定する人のメールアドレス
var $_admin_email = array("hoge@sample.com","amuamu@sample.com");

//クラス生成時の処理
function User()
{
// Railsで言うattr_accessorの設定
// DBのテーブルに無い属性を仮想的に作る場合に使います。
// 確認画面などに表示させ、入力させたいフィールドを足すのに必要なものをここでは指定
$this->set('passwd_confirmation');
// Railsで言うattr_protectedの設定
// ユーザが修正出来ないように保護するものを指定
$this->setProtectedAttributes(array('id','salt'));
//親のコンストラクタを呼びます おまじない
parent::__construct(func_get_args());

}

//入力内容のチェック
function validate()
{

//emailはユニークか?
$this->validatesUniquenessOf('email', array('notice'=>$this->t('email address registed!')));

//新しく作るときだけのチェック項目
if($this->isNewRecord()) {

//パスワードと、パスワード確認枠には入力があるか?
$this->validatesPresenceOf(array('passwd','passwd_confirmation'));

//チェックボックスの確認
$this->validatesInclusionOf('is_enable', array('1') ,$this->t('Please check checkbox of confirmation'));
}

//新しく作るとき または 修正時でかつパスワード修正がある場合のみのチェック
if($this->isNewRecord() || !empty($this->passwd))
{
//パスワードの長さチェック
$this->validatesLengthOf('passwd', array('in'=>array(5, 40), 'too_long' => $this->t('password too long.'), 'too_short' => $this->t('password too short')));

//パスワード確認の為の再入力枠とパスワードの内容が一致しているか
$this->validatesConfirmationOf('passwd', $this->t('not confirmation password'));

}

//emailとnameの空入力チェック
$this->validatesPresenceOf(array('email','name'));

//emailアドレスが有効なアドレスか?
$this->validatesFormatOf('email', AK_EMAIL_REGULAR_EXPRESSION, $this->t('error email address.')) ;


}

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

return true;
}

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

//新しいパスワードを自動生成してセット、保存する関数
//返値には新しいパスワード文(平文)が返される。
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;
}


//パスワードが修正されている場合だけ暗号化保存をする関数です。
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);
}
}
?>

こんな感じで、次号はコントローラへ・・・
posted by AMUAMU at 03:56| Comment(0) | TrackBack(0) | チュートリアル | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

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


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

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

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