我正在尝试使用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,就会发生这种情况:
- 语句调用is_loged_in
- is_loged_in确定用户未登录并调用索引
- 索引加载登录视图
- statements方法加载语句视图
在检查登录并确定用户未登录后,必须阻止代码的其他部分的进一步执行。我建议让is_loged_in方法返回bool(false)值,然后语句(和其他方法)停止执行。但是,如果您想像在多个控制器上一样分离代码,那么可以使用is_loged_in控制器将用户重定向到登录页面。