Codeigniter:在路由上重定向到控制器之前检查授权

时间:2017-12-01 19:03:41

标签: codeigniter security routes authorization

我正在使用codeigniter开发一个网络应用程序,我需要在route调用controller之前检查授权。我无法在文档中找到与此相关的任何内容。

有人有什么想法吗?

2 个答案:

答案 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 );
    }   
}
  • 在application / core文件夹中创建MY_Controller.php

将以下代码放入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
            }
        }
    }
}
  • 在$ login_check_uris里面,您必须将所有需要检查的网址放入登录状态。
  • 然后在所有控制器中扩展MY_Controller。
相关问题