「パスワードを忘れた方は」を実装したい(CakePHP修行 #22)
July 14, 2007 12:21 AM written by Gen Taguchi
すっかり間があいてしまいました・・・決して挫折したわけではありません。いろいろあるよね、人生。
さて、気を取り直してログイン画面の実装を進めていきます。今回は「パスワードを忘れた場合」の処理を付け加えます。
作業計画は以下のとおり。
- ControllerにresetPwd()を加え、Viewを作成。
- resetPwd()ではパスワード生成、DBの更新、メールの送付までを行います。
- テストして完了。
■ コントローラーとViewを設定
ではまずはControllersとViewsを次のように変更。
/controllers/users_controller.phpに以下を追加。
function resetPwd()
{
// 中身はあとで書く。
}
/views/users/reset_pwd.thtmlを追加。/users/resetPwd/にアクセスします。

↑ とりあえずきちんと表示されました。もちろんまだ動かないw。
■ resetPwd()を書く
えーと、あれだ。完成系をいきなりご紹介。
function resetPwd ()
{
$this->pageTitle = 'Reset Your Password';
$this->set('error', false);
if (!empty($this->data))
{
$someone = $this->User->findByEmail ($this->data['User']['email']);
if ($someone)
{
// set new pwd
$new_pwd = $this->generatePwd ();
$this->User->id = $someone['User']['id'];
$this->User->save (array ('pwd' => sha1(PWD_KEY.$new_pwd)) );
// send mail
$mail_file = VIEWS . 'mail/user_resetPwd.php';
$msg = implode (file($mail_file));
eval ("\$msg = \"$msg\";");
$toName = $someone['User']['email'];
$subject = "[code*code] Your new password!";
mb_send_mail ($toName, $subject, $msg, "From: ".ADMIN_EMAIL);
// write msg, jump
$this->Session->write ('sys_msg', 'new password has been sent.');
$this->redirect ('/users/login/');
}
else
{
$this->set('error', true);
}
}
}
なお、この中で新しいパスワードを生成するロジックがありますが、それは以下のようなものを作りました。
function generatePwd ()
{
$len = 8;
srand ( (double) microtime () * 1000000);
$seed = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
$pass = "";
while ($len--) {
$pos = rand(0,61);
$pass .= $seed[$pos];
}
return $pass;
}
英数字から8桁のパスワードを生成するプログラムです。なんかもちょっとエレガントにかけるような気がしないでもない。
あと、メールを送るときの送信元であるADMIN_EMAILを前回と同じように/config/app.phpに定義しました。
苦労した点をいくつか。
- データの保存の仕方がわからない
- メールのテンプレートファイルをどこに置いてどうアクセスすべきか?
- 「メールを送りました」メッセージを出したい
パスワードを生成したあとに、新しいパスワードでUsersテーブルをUpdateしなくてはいけません。チュートリアルではFormから渡されたデータをざっくり渡す例がありましたが、個々のフィールドのUpdateの仕方がわかりませんでした。
ここはずるをして青い人に聞き、「$this->User->save (array ('pwd' => sha1(PWD_KEY.$new_pwd)) );」で解決することが判明・・・。わかんなかったよ。でもまぁ、解決。
メールはハードコードしてはあほっぽいのでテンプレートファイルにしておきたいところ。ファイルを作るのは簡単ですが、どうやってアクセスしたらいいか悩んでいたところ、青い人に聞いたらAPPとかVIEWSとか便利な定数があるらしいのでVIEWSの中にメールテンプレートファイルを作り、そこにアクセスするようにしました。これで変更も楽々です。

↑ メールがちゃんと届きました!
パスワードを再設定したあとにログイン画面にリダイレクトするのですが、そのときに「メール送りましたよー」的なメッセージが欲しいところ。これは一回表示させたら消したいので、URLのパラメータで渡すことなく、そのままセッションに書き込み、Viewに渡したら消すように設定しました。

↑ あとで余力があればjQueryかなんかでふわーんと消したいところ。
以上ですかね。ちょっと時間があきましたが、やっぱりプログラミング楽しい。さてこの勢いで「情報を保存する」機能を実装してみたいと思います。
※ CakePHP修業は百式管理人がSNSっぽいものをCakePHPで作ろうとして挫折するまでの日記です。前回までのあらすじはこちらへ。
Info: CakePHP修行! |
固定リンク |
コメント (1) |
トラックバック (0) |
↑


