防止未经身份验证的用户访问控制器方法的好技术是什么?


What is a good technique to prevent unauthenticated users from accessing controller methods?

我有一个事件控制器:

class Event extends CI_Controller{
   public function index(){
   }
   public function foo(){
   }
   //Shouldn't be able to use this method unless logged in
   public function bar(){
   }

}

我正试图组织我的代码,使它相当整洁和直接。刚才我有一个名为MY_Controller的控制器,因此只有经过身份验证的用户才能访问扩展它的任何控制器的方法(edit_event()、add_event())。

但是,控制器中的一些方法需要由未经身份验证的用户访问(例如get_event())。

处理这种情况的好方法是什么?我应该创建两个完全独立的控制器还是从基本事件控制器扩展并添加经过身份验证的方法?

以前我有一个管理器控制器处理所有需要身份验证的方法,如add_user,delete_user,add_doc,delete_doc。但是它很快就被抹掉了,不容易更新或修改控制器(加上它很乱,似乎没有遵循良好的编程礼仪)。

我通常使用钩子

读一读

例如,我创建了一个url_hook.php,它控制每次页面加载,如果uri允许用户:

class url_hook{
function allowed_urls(){
$allow = array('login','logout','search');
if(in_array($allow,$this->uri->segment(2)) && $this->session->userdata('user_id')){
 //ok user allowed
return true;
}else{
//user not allowed
 redirect();

}}}

then在config/config.php i do:

$config['enable_hooks'] = TRUE;

config/hooks.php中是这样的:

 $hook['pre_controller'][] = array(
                                'class'    => 'url_hook',
                                'function' => 'allowed_urls',
                                'filename' => 'url_hook.php',
                                'filepath' => 'hooks'
                                );

所有这些都会在每次在你的应用程序中调用url时自动运行