我想检查用户是否有权访问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
);
答案 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
之前执行