【问题标题】:get the requested controller in hook precontroller in codeigniter在codeigniter的钩子预控制器中获取请求的控制器
【发布时间】:2012-12-08 16:26:41
【问题描述】:

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

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

【问题讨论】:

  • 使用acl库->为用户提供角色类型->检查每个控制器中的角色类型->只允许特定角色

标签: php codeigniter codeigniter-2 codeigniter-routing


【解决方案1】:

在您的自动加载库类中扩展 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');
        } 
    }

}

【讨论】:

    【解决方案2】:

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

    所以,获取 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];
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 这会使您的代码非常重复(DRY)。如果我真的想这样做的话,最好只扩展一个扩展 ci_controller 的附加类。
      • 是的,您可以创建一个扩展 CI_Controller 的新类 Secure_controller 并在该构造函数中添加检查。然后让您要检查的所有控制器扩展该控制器。
      • (回复您编辑的答案,而不是您的第二次回复)是的,这就是我的想法。在控制器中,有一个数组,其中包含控制器与方法和授权级别的关系。这将产生一个非常干净的代码,在一个地方来管理整个身份验证过程。当然,除非网站变得庞大
      【解决方案4】:

      $this->router->fetch_class();

      扩展 CI_Controller,这应该可以工作。

      【讨论】:

        【解决方案5】:

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

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

        逐步阅读 jondavidjohn 创建的本教程

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

        10分钟后你应该就能明白了

        【讨论】:

        • 为什么它会被认为是一种不好的做法?视情况而定,如果控制器有许多具有不同身份验证级别的方法,则在路由器级别控制它会产生更简洁的代码。
        猜你喜欢
        • 1970-01-01
        • 2012-11-26
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        • 2019-04-23
        • 2012-01-30
        • 2020-09-07
        • 1970-01-01
        相关资源
        最近更新 更多