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