CodeIgniter 用户能够复制和粘贴 URL 并访问主页

CodeIgniter User is able to copy and paste URL and access main page

我正在尝试使用 CodeIgniter 构建一个简单的登录系统。我已将所有功能放入一个控制器中,并且还在控制器中放置了一个名为 is_logged_in 的 session 检查函数。但是,用户在注销后仍然可以复制并粘贴 URL 并查看主页。好像我的登录功能不起作用。我错过了什么吗?只有当我每次都在我的 header 中检查时,它才有效。这是我的代码。

控制器文件

function index()
{
    $this->load->view('login');
}

function checklogin()
{
    $this->load->model('user');
    $query = $this->user->validate_login();

    if($query)
    {
        redirect('portal/home');
    }
    else
    {
        $this->index();
    }

}

function logout()
{
    $this->session->unset_userdata('username');
    $this->session->unset_userdata('is_logged_in');
    $this->session->sess_destroy();
    redirect($this->index(),'refresh');
}

function is_logged_in()
{

    $is_logged_in = $this->session->userdata('is_logged_in');
    if(!isset($is_logged_in)||$is_logged_in!=TRUE)
    {
        $this->index();
    }
}

function home()
{
    $this->is_logged_in();
    $data['main_content'] = 'home';
    $this->load->view('includes/template',$data);
}

function statements()
{
    $this->is_logged_in();
    $data['main_content'] = 'statements';
    $this->load->view('includes/template',$data);
}

function about()
{
    $this->is_logged_in();
    $data['main_content'] = 'about';
    $this->load->view('includes/template',$data);
}



}
?>

这是我放入我的 header 中的内容,它代替了函数

<?php
if(!$this->session->userdata('is_logged_in'))
{
    redirect('portal/index');
}
?>

用户模型

<?php

class 用户扩展 CI_Model{

function __construct()
{
    parent::__construct();
}

public function validate_login()
{
    //$this->form_validation->set_rules('username', 'Username', 'trim|required');
    //$this->form_validation->set_rules('password', 'Password', 'trim|required');
    $username = $this->security->xss_clean($this->input->post('username'));
    $password = $this->security->xss_clean(md5($this->input->post('password')));

    $this->db->where('username', $username);
    $this->db->where('password', $password);

    $query = $this->db->get('accounts');

    if($query->num_rows()==1)
    {
        foreach($query->result() as $row)
        {
            $sess_data = array(
            'username'=>$this->input->post('username'),
            'is_logged_in'=>TRUE,
            'privilege'=>$row->privilege
            );
        }

        $this->session->set_userdata($sess_data);
        return true;
    }
    else
    {
    //  echo $password;
    }
}

}

?>

此外,如何将用户模型中注释掉的部分与下一行结合起来?如果没有输入,我希望发送一条错误消息。希望我能得到帮助。

这里面大错特错了。不要,永远不要为您的应用程序使用单个控制器。事情会变得非常大,非常快,然后你有一个不可读的文件块。保持您的应用程序代码规范化。这就是您使用 MVC 的原因。如果您随后需要一种可从每个或几乎每个控制器访问的方法,则将此函数放入基本控制器(MY_Controller 即)、模型或库中,具体取决于此方法的功能。但就您而言,这是针对基本控制器的。这对您的问题没有帮助,只是一个友好的建议。

您的代码存在问题,访问者点击了方法 "statements" 的 URL,结果是这样的:

  1. 报表调用is_logged_in
  2. is_logged_in 确定用户未登录并调用 index
  3. 索引加载登录视图
  4. statements 方法加载语句视图

检查登录并确定用户未登录后,您必须阻止代码其他部分的进一步执行。我建议让 is_logged_in 方法返回一个 bool(false) 值,然后语句(和其他方法)停止执行。但是,如果您像在多个控制器上一样将代码分开,那么可能有 is_logged_in 控制器将用户重定向到登录页面。