はfuelphpでのログイン認証した際の無限ループの...
2019/12/08
親のauthコントローラの「before」を繰り返し読んでしまい無限ループになっていると思われます。
その際、Request::active()->actionにて対象のページのアクションを取得し、それを比較すれば無限ループを避けることができると思います。
試されたソースコードを確認しましたが、パターン3では上手くいかなかったのでしょうか?
Login.phpを見るとメソッド名は「action_index()」つまりアクションは「index」となると思います。
となるとRequest::active()->actionの値は「index」となるので、「Request::active()->action != 'login’」はtrueとなります。
この場合は、login.phpのアクション名を変更する必要があります。
一度、「Request::active()->action」をログやvar_dumpなどで何の値が入っているのかを確認してみてください。
また無限ループを避ける方法の参考サイトを記載しますので、ぜひご活用してみてください。
https://helog.jp/framework/fuelphp-auth/
https://qiita.com/hokutoasari/items/72c6e74ede98cf2e24cc
その際、Request::active()->actionにて対象のページのアクションを取得し、それを比較すれば無限ループを避けることができると思います。
試されたソースコードを確認しましたが、パターン3では上手くいかなかったのでしょうか?
Login.phpを見るとメソッド名は「action_index()」つまりアクションは「index」となると思います。
となるとRequest::active()->actionの値は「index」となるので、「Request::active()->action != 'login’」はtrueとなります。
この場合は、login.phpのアクション名を変更する必要があります。
一度、「Request::active()->action」をログやvar_dumpなどで何の値が入っているのかを確認してみてください。
また無限ループを避ける方法の参考サイトを記載しますので、ぜひご活用してみてください。
https://helog.jp/framework/fuelphp-auth/
https://qiita.com/hokutoasari/items/72c6e74ede98cf2e24cc
1970/01/01
Nakatani Yuya
再度検証してみたのですが、うまくいきません。
login.phpとsignup.phpのアクション名を変えて実行してみたのですが404エラーが発生しました。
おそらく、リダイレクト設定がうまくできていない可能性があるのかなっと思っています。
しかし、他のphpファイルでは
Response::redirect('login');
でlogin.phpにリダイレクトできているので、どこでエラーが発生しているのかがわかりません。
var_dampの結果は値は何も入っていませんでした。
この結果から、無限ループの場合は配列の中の値は入らないのですか?
あと、
>Request::active()->actionにて対象のページのアクションを取得し、それを比較すれば無限ループを避けることができる
>
のであれば、
>Request::active()->actionの値は「index」となるので、「Request::active()->action != 'login’」はtrue
>
この場合、
1. 比較対象の'login'と'index'は同じではないのでtrueつまり、ループし続ける。
2. 中の値を'login'と'login'でfalseにすればループから抜ける。
3. っということは、Request::active()->actionの中の値を'login'にすればいい。
っという解釈で合っていますか?
ヒントをいただけましたら幸いです。
よろしくお願いします。
検証したコードは長いため、下記のURLに添付しときます。
https://hackmd.io/sLU8caGsRyaH7mCANNWX_Q
2019/05/29
>>login.phpとsignup.phpのアクション名を変えて実行してみたのですが404エラーが発生しました。
こちらurlの指定はどうなっているでしょうか?
URLは「ドキュメントルート/コントローラ名/アクション名」という指定にしなければ指定のコントローラのアクションに遷移できずに404となります。
サンプルコードを例にすると、「localhost:8888/sample_framework01/public/login/login」でloginコントローラのaction_loginの処理に遷移することができます。
下記記事の「コントローラの基本」にて記載しています。
https://qiita.com/kazukichi/items/2a6e242091c5f485b976
>>var_dampの結果は値は何も入っていませんでした。
>>この結果から、無限ループの場合は配列の中の値は入らないのですか?
提示いただいたコードを確認すると以下のようになっていました。
Log::debug(var_dump('Request::active()->controller:', Request::active()->controller));
なぜLog::debug()の中でvar_dumpをする必要があるのでしょうか?
以下のように記載すると出力できますので、ご確認ください。
Log::debug('Request::active()->controller:', Request::active()->controller);
また気になったのですが、こちらで提示いただいたソースコード
https://hackmd.io/lCswnNUEQLOWoSQs4IjVEA?both
こちらのlogin.phpなどに以下のメソッドがありませんでした。
public before() {
parent:: before();
}
この記載がないと、親クラスである「auth.php」のbefore()メソッドを呼び出すことができず処理できないように思います。
>>Request::active()->actionの中の値を'login'にすればいい。っという解釈で合っていますか?
loginアクションをURLに指定すればそうですし、別のアクションですと別のものになります。
ログを表示することが大事なのですが、そのログからもう少し分解して考え、どこに原因があるかを調べるようにしてください。
今回、無限ループするのは、「login.phpにリダイレクトしたら、またbeforeメソッドが呼ばれ再度loginにリダイレクトする」という事象になっているからです。
そのためには「ログイン認証していない、かつloginアクションへの遷移ではない」場合にリダイレクト処理を実施するなどを考え、それが実現するためにやり方を調査します。
本来の目標は正しく捉えられていますが、なぜできないか?を考えるのが弱いのかなと感じました。
「アクション名を変えると404になる」という事象を例にすると、まず404はどういう意味なのか?普段はURLを指定すると何がキーとなってコントローラやアクションが呼ばれるのか?
どのような仕組みで動いているのか?を理解するようにしていくと、どうやれば良いか?を突き詰めることができます。
現場に行くと誰も分からない課題が出てくることはよくあります。
その中で自分で解決するにはどうすれば良いか?考える力をつけていってください。
こちらurlの指定はどうなっているでしょうか?
URLは「ドキュメントルート/コントローラ名/アクション名」という指定にしなければ指定のコントローラのアクションに遷移できずに404となります。
サンプルコードを例にすると、「localhost:8888/sample_framework01/public/login/login」でloginコントローラのaction_loginの処理に遷移することができます。
下記記事の「コントローラの基本」にて記載しています。
https://qiita.com/kazukichi/items/2a6e242091c5f485b976
>>var_dampの結果は値は何も入っていませんでした。
>>この結果から、無限ループの場合は配列の中の値は入らないのですか?
提示いただいたコードを確認すると以下のようになっていました。
Log::debug(var_dump('Request::active()->controller:', Request::active()->controller));
なぜLog::debug()の中でvar_dumpをする必要があるのでしょうか?
以下のように記載すると出力できますので、ご確認ください。
Log::debug('Request::active()->controller:', Request::active()->controller);
また気になったのですが、こちらで提示いただいたソースコード
https://hackmd.io/lCswnNUEQLOWoSQs4IjVEA?both
こちらのlogin.phpなどに以下のメソッドがありませんでした。
public before() {
parent:: before();
}
この記載がないと、親クラスである「auth.php」のbefore()メソッドを呼び出すことができず処理できないように思います。
>>Request::active()->actionの中の値を'login'にすればいい。っという解釈で合っていますか?
loginアクションをURLに指定すればそうですし、別のアクションですと別のものになります。
ログを表示することが大事なのですが、そのログからもう少し分解して考え、どこに原因があるかを調べるようにしてください。
今回、無限ループするのは、「login.phpにリダイレクトしたら、またbeforeメソッドが呼ばれ再度loginにリダイレクトする」という事象になっているからです。
そのためには「ログイン認証していない、かつloginアクションへの遷移ではない」場合にリダイレクト処理を実施するなどを考え、それが実現するためにやり方を調査します。
本来の目標は正しく捉えられていますが、なぜできないか?を考えるのが弱いのかなと感じました。
「アクション名を変えると404になる」という事象を例にすると、まず404はどういう意味なのか?普段はURLを指定すると何がキーとなってコントローラやアクションが呼ばれるのか?
どのような仕組みで動いているのか?を理解するようにしていくと、どうやれば良いか?を突き詰めることができます。
現場に行くと誰も分からない課題が出てくることはよくあります。
その中で自分で解決するにはどうすれば良いか?考える力をつけていってください。
1970/01/01
Nakatani Yuya
ご指摘ありがとうございます。以後精進して学習に励みます。
ありがとうございました。
ありがとうございました。
2019/05/29
部活の学習一覧
Lesson 01
「フレームワークってなに?」
Lesson 02
「FuelPHPをインストールしよう!」
Lesson 03
「ビューを作ってみよう!」
Lesson 04
「コントローラからビューへ値を渡そう!」
Lesson 05
「バージョン管理のGitを使おう!」
Lesson 06
「Gitを利用したsourcetreeを使おう!」
Lesson 07
「画像やCSS、リンクを入れてみよう!」
Lesson 08
「コントローラとアクション」
Lesson 09
「コントローラの色々な使い方」
Lesson 10
「モデルを作ってみよう!」
Lesson 11
「実践!ユーザー登録機能を作ろう!part1」
Lesson 12
「実践!ユーザー登録機能を作ろう!part2」
ご意見箱
今回はfuelphpでのログイン認証した際の無限ループの抜け出し方を質問です。
宿題を終わらせた後に、上記の質問者のようにauthメソッドを使いログイン認証コードを書いたのですが、無限ループにハマっています。
いろいろ試したのですが、解決がしませんでした。
webサービス部を見直したところ、lesson12に無限ループの説明があったので、basename関数を使ったのですが、反応しませんでした。
basename関数をfuelphpでどう書くのかわからなかったのでいろいろ調べて試したのですがうまくいきません。
phpドキュメントで調べたらbasenameはファイルシステム関数と表記されていたので、fuelphpのドキュメントでfileかな?っと思い調べたのですがうまくいきません。
何か、ヒントをいただけましたら幸いです。
よろしくお願いします。
検証したコードは長いため、下記のURLに添付しときます。
https://hackmd.io/lCswnNUEQLOWoSQs4IjVEA?both
参照URL
https://www.php.net/manual/ja/function.basename.php
http://fuelphp.jp/docs/1.9/classes/file/intro.html