1

我正在尝试制定一个简单的路由规则,只允许经过身份验证的用户访问某些控制器。

为此,我想运行 precontroller hook 并检查用户是否使用 ci session 登录。但是,我必须知道用户想要访问哪个控制器。我如何在钩子函数中知道这一点?

4

5 回答 5

4

$this->router->fetch_class();

扩展 CI_Controller 这应该可以工作。

于 2012-12-21T08:34:33.920 回答
3

我不认为钩子是你想要在这里实现的最佳实践

您可以尝试以下操作:您需要创建将扩展的中间控制器,而不是 CI_Controller 将进行身份验证检查并将用户重定向到正确的控制器

逐步阅读 jondavidjohn 创建的本教程

http://jondavidjohn.com/blog/2011/01/scalable-login-system-for-codeigniter-ion_auth

你应该能在 10 分钟后得到这个想法

于 2012-12-21T04:48:09.240 回答
0

您不能将身份验证放在控制器构造函数上吗?它会在项目实例化时被调用,您可以在那里进行检查。此外,您始终可以扩展 CI_Controller 并将逻辑放入其中,以便您可以在那里进行检查(并按照建议使用 this->router->fetch_class() )。

于 2012-12-21T08:45:35.407 回答
0

在您的自动加载库类中扩展 CI_Controller。

像这样的东西:

class MyAuthLibrary extends CI_Controller {
    var $ci;

    function __construct() {

        $this->ci = &get_instance();
        $route = $this->ci->router->fetch_class();

        if( ($route !== 'login') && !$this->ci->session->userdata('email_address') ) {
            redirect('login');
        } 
    }

}
于 2013-05-08T15:17:53.653 回答
0

如果你不想走扩展控制器路由,我可以在那里看到你的逻辑,那么你必须在这里使用原生 PHP,因为 CI 对象不存在于 pre_controller_hook 中。

因此,获取 URI,然后对其进行解析以找到控制器:

$uri = $_SERVER['REQUEST_URI'];
$segments = explode("/", $uri);

// if you're removing index.php from your urls, then
$controller = $segments[0];

// if you're not removing index.php
$controller = $segments[1];
于 2012-12-21T16:57:23.277 回答