#概要
以前、CakePHPのブログチュートリアル(https://book.cakephp.org/2/ja/tutorials-and-examples/blog/blog.html )に沿って、ログイン機能付きの掲示板を作成しました。
今回は、パスワードを忘れた方のために、パスワード再設定機能を追加しました。
再設定ページでは、新パスワード入力後にログインページにリダイレクトされるようにコードを書きました。
実際に再設定からログインまでやってみると、10回に1回くらいの割合でログイン後に再設定ページへリダイレクトされる事が起こりました。
#解決方法
###ログイン後の転送先を指定する。
↓修正前
このコードではredirectUrl()に転送先を指定していない。
public function login() {
if ($this->request->is('post')) {
if ($this->Auth->login()) {
$this->Flash->success(__('ログインしました'));
$this->redirect($this->Auth->redirectUrl());
} else {
$this->Flash->error(__('メールアドレスまたはパスワードが無効です、再度お試しください'));
}
}
}
↓修正後
public function login() {
if ($this->request->is('post')) {
if ($this->Auth->login()) {
$this->Flash->success(__('ログインしました'));
//ログイン後リダイレクト先の設定
$this->redirect($this->Auth->redirectUrl(array('controller' => 'posts', 'action' => 'index')));
} else {
$this->Flash->error(__('メールアドレスまたはパスワードが無効です、再度お試しください'));
}
}
}
このようにredirectUrl()に転送先を指定することで、この問題が解決された。
##ではそもそも、"$this->Auth->redirectUrl()"は何を返すのか?
redirecutUrl()メソッドは以下の優先順位でURLを返す。(引用:CakePHP2 定番レシピ119)
###①セッションにURLが保存さていればそのURL
AuthComponentでは、非ログイン状態でログインが必要なURLがリクエストされた場合は、そのURLをセッションに保存した上でログインページに転送する。
・この処理のメリット
掲示板で「新規投稿をするためにはログインしている必要がある」場合、非ログイン状態で新規投稿リクエストを受けたら、ログインページに転送しログイン完了時に新規投稿ページに転送されるという動作を実現できる。
###②AuthComponentのloginRedirectプロパティにURLが指定されていればそのURL
ログイン完了後にもとのURLではなく、指定したURLに戻りたい場合は、redirectUrl()メソッドを使用して戻り先URLを指定する。redirect()はセッションに保存された戻り先URLの書き換えを行う。(今回の問題の解決方法)
###③デフォルトのURL(/)
上2つのどちらにも当てはまらない場合は、デフォルトのURLに転送される。
以上となります。