1

ユーザーがログインしていない場合、ページからのアクセスを制限しようとしています。奇妙なことに、許可されていないユーザーがWebページにアクセスしようとすると、制限されたアクセスのページが表示されます(「許可されていない場合はログインしてください。 "メッセージと、同じページで、メンバー専用ページをロードします)。

サイト管理者の場合:

class Site extends CI_Controller {

function __construct(){

    parent::__construct();

    $isLogged=$this->session->userdata('logged');
    if($isLogged!='logged' || !isset($isLogged)){

        $data['content']='denied';
        $this->load->view('include/template', $data);

    }


}

function members(){

        $data['content']='memberArea';
        $this->load->view('include/template', $data);

}

ログインフォーム:

class Login extends CI_Controller {


function index () {

    $data['content']='loginForm';
    $this->load->view('include/template', $data);  
}


function validateMember(){

    // load the model for the login authentification
    $this->load->model('loginModel');
    //query should also contain the user details 
    $query = $this->loginModel->authenticate();

    //if it returns something:
    if($query){

        foreach ($query as $row){

            //set user data to be passed    
            $details=array(
            'username'=>$row->user_name,
            'id'=>$row->id,
            'logged'=>'logged',);

        }

    //set session
    $this->session->set_userdata($details); 

    redirect('site/members');

    }

    else{

        $this->index(); 
    }


}

ログインのモデルは次のとおりです。

class LoginModel extends CI_Model {

function authenticate(){

//select active fields
$this->db->select('id, user_name, password');    
// query to select from table where conditions
$query = $this->db->get_where('login', array(
            'user_name'=>$this->input->post('username'),
            'password'=>$this->input->post('password'),), 
                    1);

    //if it finds something...must ask if i need to manually close the database with $this->db->close();
    if($query->num_rows()==1){

        foreach($query->result() as $row){

            $data[]=$row; 
        }

        return $data;
    }

    else {return false;}
}

}

私のテストでは、構成関数が失敗した場合でも、サイトが他の関数を呼び出し続けることが示されました。セッションにはデータが含まれています。die()またはexit()を使用すると、Webページが空白で読み込まれます。よろしくお願いします!

PS:ビュー<p>にはそれらだけがあり、派手なものは何もありません。

4

3 に答える 3

1

私はこの問題に対する2つの解決策を見ることができます。

  1. 認証をチェックしない別のページにリダイレクトします。redirect(<url>);URLヘルパーから使用できます。

  2. バッファリングされた出力をフラッシュした状態で使用exit()します。__construct()呼び出すと、データはCodeIgniterで$this->load->view()呼び出されるバッファーに送信されます。output次のようにして、そのバッファを書き込むことができます。

    if($isLogged!='logged' || !isset($isLogged)){
    
        $data['content']='denied';
        $this->load->view('include/template', $data);
    
        // Write the output.
        echo $this->output->get_output();  
    
        // Stop the execution of the script.
        exit();
    }
    

    または、次のコマンドで出力バッファをバイパスできます。

    if($isLogged!='logged' || !isset($isLogged)){
    
        $data['content']='denied';          
    
        // Writes the content instead of sending it to the buffer.  
        echo $this->load->view('include/template', $data, true);  
    
        // Stop the execution of the script.
        exit();
    } 
    

好きなものを選んでください。

于 2013-03-24T14:31:38.857 に答える
0

コンストラクターメソッドは「失敗」せず、ifステートメントは単純に実行され(条件が真であるため)、これによって他のメソッドの実行が妨げられる理由はありません。

コンストラクターメソッド内のifブロックの最後にexitステートメントを挿入できます。これにより、ページはおそらく期待どおりに動作します。

ここを参照してくださいhttp://php.net/manual/en/function.exit.php

于 2013-03-24T13:49:28.997 に答える
0

クエリが実際に何かを返すかどうかではなく、クエリがあるかどうかをテストしています。num行をチェックし、それらが1に等しいことを確認します。ログインチェックでは、0より大きい値を実行することはお勧めできません。

if($query->num_rows==1){

PS。モデルコードも投稿してください。エラーが発生している可能性があり、そうでない場合でも結果が返されます。

于 2013-03-24T13:58:48.193 に答える