1

CodeIgniter 2.1.2 に問題があり、解決しようと何時間も立ち往生しています :-/

私はそれについてたくさんの (!) スレッドがあることを知っていますが、私の問題の解決策を見つけることができませんでした.

コンストラクターにメソッドをロードして、ユーザーがログインしているかどうかを確認したいので、これを試しました:

class my_class extends CI_Controller
{
public function __construct();
parent::__construct();

$this->check(); //doesn't work, endless redirection loop
}

「チェック()」は次のとおりです。

public function check()
{
    if (! $this->session->userdata('logged_in'))  
    {     
        redirect('/login'); // tried with & without '/'
    }
}

メソッド「login()」は次のようになります。

public function login()
{
  ...
  //do form validation stuff and on success:
  if ($this->form_validation->run() == TRUE)
    {
     $this->session->set_userdata('logged_in', TRUE);
     redirect('/entry'); 
    }
   //load login_view
}

メソッド "entry()":

public function entry()
{
  //$this->check();//Old (redundant) Version

  //Authorized and Happy...
}

// 他のいくつかのメソッドも最初に check() メソッドを呼び出します

だから私の質問は、メソッドの呼び出しが機能するのはなぜですか (ただし、多くの冗長な呼び出しがあります)、コンストラクターの呼び出しで無限ループが発生するのはなぜですか? 私は何かが恋しいですか?? (htaccessファイルの内容も変更していません..)

事前にThx :-)

4

3 に答える 3

2

コメンテーターが言ったことを詳しく説明するには:

MY_Controllerしばらくソリューションを完全に無視すると、問題は、ログイン コントローラーを含むすべてのコントローラーで__construct()メソッド (およびその後)が呼び出されることです。$this->check()

  1. ホームページを読み込みます。コンストラクターがロードしますcheck()
  2. ログインしていません。にリダイレクトし/loginます。
  3. ログインコンストラクターがロードしますcheck()
  4. ログインしていません。にリダイレクトし/loginます。

...などなど。

解決策は、どの URL がアクセスされているかを確認することです。それがログイン コントローラー/メソッドに属している場合は、リダイレクトを実行しないでください。

public function check()
{
    if ($this->uri->uri_string() !== 'login' && ! $this->session->userdata('logged_in'))
    {     
        redirect('login');
    }
}

逆に、ログイン メソッドは、ユーザーが実際に既にログインしているかどうかを確認し、ログインしている場合は、ホームページなどにリダイレクトする必要があります。しかし、私は脱線します。


MY_Controller解決策には、コンストラクターがログインチェックを実行するベースコントローラーを作成することが含まれます。次に、そのチェックを実行するコントローラーは、MY_Controllerの代わりに拡張する必要がありCI_Controllerます。

チェックを実行したくないため、ログインコントローラーが拡張されないことに注意してください。そうしないと、無限ループが再び表示されます。MY_Controller

于 2013-03-15T01:56:11.377 に答える
0

ここにいくつかの簡単な提案がありますが、最初にconfig/autoload.phpでセッションライブラリを自動ロードすることを確認してください

これはログイン クラスではありません。ログインクラスにリダイレクトはなく、$this->enterLogin() またはメソッド名が何であれ、ループしないように直接移動します。

 // Capitalize the first letter of the class!!
 class My_class extends CI_Controller
 {
     public function __construct();
     parent::__construct();

     // check if login is false
     // redirect here in the constructor, not buried in a method
     // note the underscore in the name _checkLogin() to make that method private

     if ( $this->_checkLogin() == false ) 
    { redirect( '/login/', 'refresh' );  }

 } // end constructor


 // private function 
 function _checkLogin(){
    if (! $this->session->userdata('logged_in'))  
    {   return false ;  }
    else
    { return true; } 

  } // 
于 2013-03-14T18:01:35.180 に答える
0

正確に言うのは難しいですが、ここに行きます。

login() はmy_class クラス/コントローラーのメソッドではないと思います。そうである場合、コンストラクターが毎回呼び出されるため、これがエラーの原因である可能性があります。

より良い方法は、Auth_Controller などの CI_Controller を拡張するセキュア コントローラーを用意することです。これは、application/libraries/MY_Controller.php ファイルにあります。

安全なコントローラーは Auth_Controller を拡張し、check() はそのコンストラクターで作成されます。ログイン コントローラは Auth_Controller を拡張しません。

于 2013-03-14T16:16:04.997 に答える