我有一个使用CodeIgniter的网站,现在几乎已经完成了。我的问题是,即使我已经实现了会话并维护了一个登录系统,一个人可以通过在浏览器地址栏中输入URL来访问任何页面。
我已经实施了患者注册会议,如下所示:
function index(){
$this->is_logged_in();
}
function log_out(){
$this->session->sess_destroy();
redirect('login_controller');
}
function is_logged_in(){
$is_logged_in = $this->session->userdata('is_logged_in');
if(!isset($is_logged_in)||$is_logged_in!= TRUE ){
redirect('login_controller');
}else{
$this->main();
}
}
匿名用户无法通过输入如下控制器名称来访问系统:
但他们可以这样做:
http://localhost/demo_site/index.php/register_controller/search_patient
人员无法通过键入控制器名称来访问,但可以通过键入比控制器更长的URL来进入系统,如上所示。
这是什么问题?有什么可能的解决方案?
答案 0 :(得分:8)
您必须在控制器的构造函数中实现登录检查。
每当调用控制器时,都应检查用户是否已登录 - 如果不是,则重定向到登录页面或错误页面。
答案 1 :(得分:2)
要确认是否正在进入登录检查,请在echo
功能中添加exit
和is_logged_in()
,并检查http://localhost/demo_site/index.php/register_controller/search_patient
您可能正在对各自的模块进行登录检查,因此您在某些情况下错过了。
最好定义一组私有模块(例如在数组中)并在前控制器本身(在一个地方)进行登录检查,而不是在模块级别重复进行。
答案 2 :(得分:1)
听起来像路由问题。您需要设置路由以使第二种情况非法或至少映射到与第一种情况相同的控制器。有关路由here的更多信息。
答案 3 :(得分:1)
我同意tHeSiD。这段代码应该放在构造函数中。理想情况下,在用于扩展所有管理相关或受限类的基类中。通常我使用扩展CI_Controller(2.0)或Controller(1.7.x)的Admin_Controller基类,然后通过扩展管理控制器来创建我的应用程序控制器。