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