2

CodeIgniter で「post_controller_constructor」フックをセットアップしようとしています。目的は、ユーザーがログインしていないかどうかを確認し、ログイン ページにリダイレクトすることです。

ここに私のフック構成配列があります:

$hook['post_controller_constructor']  = array(
   'class'     => 'Checkpoint',
   'function'  => 'check_status',
   'filename'  => 'checkpoint.php',
   'filepath'  => 'controllers'
);

そして、これはフックイベントのクラスです

class Checkpoint {
var $CI;
function __construct(){
    $this->CI =& get_instance();
}
function check_status() {
    if($this->CI->router->class == 'Login'){
        return;
    } 
    if (!isset($this->CI->session)){
        $this->CI->load->library('session');
    } 
    if(!$this->CI->session->userdata('log_status')){
        //redirect(site_url('login'));
        echo "not logged in";
    }
    else{
        echo "logged in";
    }
}}

ここに問題があります:

  1. 「ログイン」コントローラーからリクエストを受け取ると、check_status() 関数内の最初の if ステートメントから返されず、ビューをロードする前に「ログインしていません」と出力されます。

  2. セッション ユーザーデータが設定されていない場合にリダイレクトしようとすると、ブラウザに「この Web ページにはリダイレクト ループがあります」というエラーが表示されます。このため、リダイレクトステートメントをコメントアウトしました

これらの問題を解決するにはどうすればよいですか?

4

1 に答える 1

3

As I described in my comment that your problem is when you enter your site the hook checks whether you are logged in or not, so if you are not then it will redirect you to your login page which will also trigger the hook once again which will cause an infinite redirecting process. Here's a possible solution: First, assign a user_data (once the user enters your site) in your session that represents that the user is already in your site like:

$this->session->set_userdata('is_in_login_page', TRUE);

then in your hook you can check it like:

if(!$this->CI->session->userdata('log_status') &&
 !$this->CI->session->userdata('is_in_login_page') ){
    redirect(site_url('login'));
    echo "not logged in";
}

so once the user is redirected, the 'is_in_login_page' value will be set to TRUE and the server will not redirect him anymore.

it might sound silly but I think it's a good solution in your case.

NOTE: the is_in_login_page should be set to FALSE when the user is not logged in and he is not on the login page so the server will redirect him to it.

于 2013-09-21T08:18:01.667 に答える