pre_controller与post_controller_constructor冲突

时间:2013-03-12 17:47:56

标签: php codeigniter-2

我想检查用户是否有权访问URL(控制器/方法)组合。它应该在被调用的控制器和方法中调用的任何方法属于它之前检查。

据我了解,对于上面的逻辑,钩子应该是pre_controller但是当我使用它时,我认为它与下面显示的post_controller_constructor冲突。如果我使用post_controller代替那么它可以工作,但这次逻辑被破坏了。

我该如何解决这个问题?

由于

CONFIG /钩

//Used to authenticate user session to decide whether to authenticate site or not
$hook['post_controller_constructor'] =
array(
'class'    => 'site_authentication',
'function' => 'authenticate',
'filename' => 'site_authentication.php',
'filepath' => 'hooks',
'params'   => null
);


//Used to authenticate permitted controllers
$hook['pre_controller'] =
array(
'class'    => 'permitted_controllers',
'function' => 'authenticate',
'filename' => 'permitted_controllers.php',
'filepath' => 'hooks',
'params'   => null
);

应用/挂钩

//This works fine
class site_authentication
{
    private $CI;

    public function __construct()
    {
        $this->CI =& get_instance();
    }

    public function authenticate()
    {
        if (! $this->CI->session->userdata('site'))
        {
            redirect('to error page');
        }

        $user_session = $this->CI->session->userdata('site');
        //Some more stuff here
    }
}



//This doesn't work with pre_controller
class permitted_controllers
{
    private $CI;

    public function __construct()
    {
        $this->CI =& get_instance();
    }

    public function authenticate()
    {
        $user_session = $this->CI->session->userdata('site');

        //Url is set here, ignore syntax error below
        $url = $this->CI->uri->segment(1) . 2 . 3;

        if (! in_array($url, $user_session['controllers']))
        {
            redirect('to error page');
        }
    }
}

如果我将它们合并为两个,它们在post_controller_constructor下工作正常,但它们不能单独工作?

$hook['post_controller_constructor'] [] =
array(
'class'    => 'site_authentication',
'function' => 'authenticate',
'filename' => 'site_authentication.php',
'filepath' => 'hooks',
'params'   => null
);

$hook['post_controller_constructor'] [] =
array(
'class'    => 'permitted_controllers',
'function' => 'authenticate',
'filename' => 'permitted_controllers.php',
'filepath' => 'hooks',
'params'   => null
);

2 个答案:

答案 0 :(得分:2)

pre_controller挂钩在构造超级对象之前运行,因此它不适合挂钩到CI的正常语法(例如$this->db->query())。

我建议创建一个基本控制器(也称为MY_Controller或其他名称)并将权限检查添加到其构造函数中。然后,应该运行权限检查的每个控制器将扩展MY_Controller而不是CI_Controller。 Here's Phil Sturgeon's classic article about base controllers.

每次加载页面时都会调用挂钩。如果您不需要在某处检查权限,则需要将该逻辑添加到挂钩中,或者在其他位置添加逻辑以尝试禁用它。不太可扩展。使用基本控制器,添加权限检查就像扩展不同的类一样简单。

答案 1 :(得分:0)

pre_controller挂钩在超级对象完全构造read more here

之前执行