• 初めまして。 今回
    はfuelphpでのログイン認証した際の無限ループの...
  • 質問者画像

    Nakatani Yuya 
    初めまして。
    今回は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
    回答 0

     
    親の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

    返信者画像

    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

     
    >>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を指定すると何がキーとなってコントローラやアクションが呼ばれるのか?

    どのような仕組みで動いているのか?を理解するようにしていくと、どうやれば良いか?を突き詰めることができます。

    現場に行くと誰も分からない課題が出てくることはよくあります。
    その中で自分で解決するにはどうすれば良いか?考える力をつけていってください。

    返信者画像

    Nakatani Yuya 
    ご指摘ありがとうございます。以後精進して学習に励みます。

    ありがとうございました。