「パスワードを忘れた方は」を実装したい(CakePHP修行 #22)

SPONSORED LINK

Pocket

すっかり間があいてしまいました・・・決して挫折したわけではありません。いろいろあるよね、人生。

さて、気を取り直してログイン画面の実装を進めていきます。今回は「パスワードを忘れた場合」の処理を付け加えます。

作業計画は以下のとおり。

  1. ControllerにresetPwd()を加え、Viewを作成。
  2. resetPwd()ではパスワード生成、DBの更新、メールの送付までを行います。
  3. テストして完了。

■ コントローラーとViewを設定

ではまずはControllersとViewsを次のように変更。

/controllers/users_controller.phpに以下を追加。

function resetPwd()
{
  // 中身はあとで書く。
}

/views/users/reset_pwd.thtmlを追加。/users/resetPwd/にアクセスします。

resetpwd_1.gif

↑ とりあえずきちんと表示されました。もちろんまだ動かない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の中にメールテンプレートファイルを作り、そこにアクセスするようにしました。これで変更も楽々です。

    resetpwd_3.gif

    ↑ メールがちゃんと届きました!

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

    resetpwd_2.gif

    ↑ あとで余力があればjQueryかなんかでふわーんと消したいところ。

以上ですかね。ちょっと時間があきましたが、やっぱりプログラミング楽しい。さてこの勢いで「情報を保存する」機能を実装してみたいと思います。

※ CakePHP修業は百式管理人がSNSっぽいものをCakePHPで作ろうとして挫折するまでの日記です。前回までのあらすじはこちらへ。

ツイッターもやっています!

SPONSORED LINK

    • 高田
    • July 15th, 2007

    初期パスワードを作るときに、「1」と「l(小文字のL)」や「o(小文字のO)」と「O(大文字のO)」と「0(数字の0)」のような似てる文字(フォントによって判別が難しい・・・)は適用しないようにしておくと少し幸せかもです。