LoginSignup
2
2

More than 3 years have passed since last update.

【CakePHP2】想定していないページにリダイレクト(転送)される

Last updated at Posted at 2020-07-19

概要

以前、CakePHPのブログチュートリアル(https://book.cakephp.org/2/ja/tutorials-and-examples/blog/blog.html )に沿って、ログイン機能付きの掲示板を作成しました。
今回は、パスワードを忘れた方のために、パスワード再設定機能を追加しました。
再設定ページでは、新パスワード入力後にログインページにリダイレクトされるようにコードを書きました。
実際に再設定からログインまでやってみると、10回に1回くらいの割合でログイン後に再設定ページへリダイレクトされる事が起こりました。

解決方法

ログイン後の転送先を指定する。

↓修正前
このコードではredirectUrl()に転送先を指定していない。

UsersController.php
public function login() {
   if ($this->request->is('post')) {
      if ($this->Auth->login()) {
         $this->Flash->success(__('ログインしました'));
         $this->redirect($this->Auth->redirectUrl());
      } else {
         $this->Flash->error(__('メールアドレスまたはパスワードが無効です、再度お試しください'));
      }
   }
}

↓修正後

UsersController.php
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に転送される。

以上となります。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2