我正在使用codeigniter
开发一个网络应用程序,我需要在route
调用controller
之前检查授权。我无法在文档中找到与此相关的任何内容。
有人有什么想法吗?
答案 0 :(得分:1)
Codeigniter有一个相同的解决方案 - 它被称为钩子。 它们就像事件处理程序一样,在某些事件上触发,如预控制器/后控制器。您可以参考该文档。
但是你需要做什么 - 在配置文件中启用挂钩。
$config['enable_hooks'] = TRUE;
由于您希望在执行controller方法之前执行某些操作,因此您可以挂钩到pre_controller或post_controller_constructor。
您要参考的代码示例:
$hook['pre_controller'] = array(
'class' => 'Security',
'function' => 'checkForSecurity',
'filename' => 'Security.php',
'filepath' => 'hooks'
);
你需要在这里做什么 - 现在你需要在文件夹(hooks)中创建一个文件 - Security.php。在那里,使用方法 - checkForSecurity定义一个类Security。
在这里,您可以做的是 - 在允许任何用户进一步传递之前进行授权。如果您有任何未被授权访问您希望限制的控制器区域的用户,您只需将用户重定向到登录页面,或者您可以向用户抛出错误页面。
快乐编码:)
答案 1 :(得分:1)
您可以创建通用控制器“MY_Controller.php”并使用所有控制器进行扩展。
您的配置文件的变量应为$ config ['subclass_prefix'] ='MY _';
在配置文件中,您需要添加以下代码以从核心文件夹中加载所有类文件
function __autoload($class)
{
if(strpos($class, 'CI_') !== 0 && file_exists( APPPATH . 'core/'. $class . EXT )) {
include_once( APPPATH . 'core/'. $class . EXT );
}
}
将以下代码放入MY_Controller.php
class MY_Controller
{
function __construct() {
$this->load->library('auth');
$login_check_uris = array(
'users/profile' // users -> controller name ; profile -> function name
);
// check against logged in
if (in_array(uri_string(), $login_check_uris)) {
if ($this->auth->logged_in() == FALSE) {
// check for ajax request
if ($this->input->is_ajax_request()) {
$return = array('status' => 0, 'msg' => 'Please login to perform this request.');
echo json_encode($return);
exit;
} else {
redirect('users/login'); // login url
}
}
} else if(uri_string() == 'users/login') {
// check if already login
if ($this->auth->logged_in()) {
redirect('users/profile'); // user profile page
}
}
}
}