2012-12-21 104 views
1

我试图做一个简单的路由规则,只允许通过身份验证的用户到某些控制器。在codeigniter中获取请求的控制器钩预控制器

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

+0

使用ACL库 - >给予角色类型的用户 - >检查角色类型在每一个控制器 - >只允许特定的角色 –

回答

4

$ this-> router-> fetch_class();

扩展CI_Controller,这应该工作。

3

我不认为钩子是最好的做法,你要在这里实现

你可以尝试以下内容: 您需要创建中间控制器,你会延长,而不是是CI_Controller,将有认证检查和重定向用户右键控制器

一步阅读本教程由jondavidjohn一步创建

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

你守d能够在10分钟后得到想法

+0

为什么会被认为是不好的做法?根据具体情况,如果一个控制器拥有许多不同认证级别的方法,那么在路由器级别控制它将产生更简洁的代码。 – jjj

0

无论你只是把身份验证放在控制器的构造函数? 它会在物品实例化时调用,您可以在那里执行检查。 您也可以始终扩展CI_Controller并将逻辑放在那里,以便您可以在那里执行检查(并按照建议使用this-> router-> fetch_class())。

+0

这会让你的代码非常重复(DRY)。如果我真的想这样做,扩展一个扩展ci_controller的额外类会更好。 – jjj

+0

Yeap,你可以创建一个新的类Secure_controller来扩展CI_Controller,并在该构造函数中添加检查。 然后让你想检查的所有控制器扩展该控制器。 – tix3

+0

(回复你编辑的答案,而不是你的第二个答复)是的,这正是我的想法。在控制器中,有一个包含控制器和方法与身份验证级别关系的数组。这将产生一个非常干净的代码与一个地方来管理整个认证过程。当然,除非网站变得庞大 – jjj

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]; 
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'); 
     } 
    } 

}