我正在尝试制定一个简单的路由规则,只允许经过身份验证的用户访问某些控制器。
为了实现这一点,我想运行precontroller hook并检查用户是否使用ci session登录。但是,我必须知道用户想要访问哪个控制器。我如何在钩子函数中知道这一点?
答案 0 :(得分:4)
$这 - >路由器 - > FETCH_CLASS();
扩展CI_Controller,这应该可行。
答案 1 :(得分:3)
我不认为钩子是你想要达到的目标的最佳实践
您可以尝试以下方法: 您需要创建将扩展的中间控制器,而不是将进行身份验证检查并将用户重定向到右控制器的CI_Controller
逐步阅读由jondavidjohn创建的本教程
http://jondavidjohn.com/blog/2011/01/scalable-login-system-for-codeigniter-ion_auth
你应该在10分钟后得到这个想法
答案 2 :(得分:0)
你不能把认证放在控制器构造函数上吗? 项目实例化时会调用它,你可以在那里进行检查。 此外,您始终可以扩展CI_Controller并将逻辑放在那里,以便您可以在那里进行检查(并按照建议使用this-> router-> fetch_class())。
答案 3 :(得分:0)
如果您不想使用扩展控制器路由,并且我可以在那里看到您的逻辑,那么您必须在此处使用本机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];
答案 4 :(得分: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');
}
}
}