1

如果用户未登录,我正在尝试限制来自页面的访问。奇怪的是,当未经授权的用户尝试访问该网页时,会显示受限访问的页面(带有“未经授权,请登录"消息,并且在同一页面上,它会加载仅限成员的页面)。

对于站点控制器:

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() 网页加载空白。提前谢谢了!

PS:观点只<p>在其中,没有什么花哨的。

4

3 回答 3

1

我可以看到这个问题的两种解决方案。

  1. 重定向到不检查身份验证的另一个页面。您可以redirect(<url>);从 URL 帮助程序中使用。

  2. exit()__construct()缓冲输出被刷新的情况下使用。当您调用时$this->load->view(),数据将发送到outputCodeIgniter 中调用的缓冲区。您可以通过执行以下操作来写入该缓冲区:

    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 回答