2010-12-17 54 views
0

我有一个使用CodeIgniter的网站,现在已经基本完成了。我的问题是,即使我已经实现了会话并保持登录系统,但个人可以通过在浏览器地址栏中输入URL来访问任何页面。如何防止用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

但他们可以这样做:

http://localhost/demo_site/index.php/register_controller/search_patient

人不能通过键入控制器名称的访问,但是可以通过除了所述控制器输入一个长URL,如上所示的一个进入系统。

这里有什么问题?什么是可能的解决方案?

回答

1

听起来像一个路由问题。您需要设置您的路线以使第二种情况非法或至少映射到与第一种情况相同的控制器。更多关于路线here

8

您必须在控制器的构造函数中实现登录检查。

无论何时调用控制器,都应检查用户是否已登录 - 如果不是,则重定向到登录页面或错误页面。

+0

其次。将逻辑放在控制器的构造函数中......不需要为所有可能的路径制定独特的规则。 – treeface 2010-12-17 18:33:51

2

要确认如果输入登录检查放一个echoexitis_logged_in()函数内部并检查是否出现在http://localhost/demo_site/index.php/register_controller/search_patient

你可能做登录检查你的各模块,因此你错过了的情况下一些案例。

最好是定义一组私有模块(比如说在一个数组中)并在前台控制器本身(在一个地方)进行登录检查,而不是在模块级别重复。

1

我同意tHeSiD。这段代码应该放在构造函数中。理想情况下,在您用来扩展所有与管理相关或受限制的类的基类中。通常我使用扩展CI_Controller(2.0)或Controller(1.7.x)的Admin_Controller基类,然后通过扩展管理控制器来创建我的应用程序控制器。