CodeIgniter用户可以复制和粘贴URL并访问主页


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

我正在尝试使用CodeIgniter构建一个简单的登录系统。我已将所有函数放入一个控制器中,还将一个名为is_loged_in的会话检查函数放入控制器中。但是,用户在注销并查看主页后仍然可以复制和粘贴URL。我的登录功能似乎不起作用。我是不是错过了什么?只有当我每次都在页眉中加一个复选框时,它才会起作用。这是我的密码。

控制器文件

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);
}

}
?>

这是我放在标题中的内容,它实际上起作用,而不是功能

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

用户模型

<?php

类用户扩展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)、模型或库中。但在您的情况下,这是针对基本控制器的。这对你的问题没有帮助,只是一个友好的建议。

你的代码的问题是,访问者点击方法"语句"的URL,就会发生这种情况:

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

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