我试图做一个简单的路由规则,只允许通过身份验证的用户到某些控制器。在codeigniter中获取请求的控制器钩预控制器
为了实现这一点,我想运行预控制器钩子并检查用户是否使用ci会话登录。但是,我必须知道用户想要访问哪个控制器。我如何在钩子函数中知道这一点?
我试图做一个简单的路由规则,只允许通过身份验证的用户到某些控制器。在codeigniter中获取请求的控制器钩预控制器
为了实现这一点,我想运行预控制器钩子并检查用户是否使用ci会话登录。但是,我必须知道用户想要访问哪个控制器。我如何在钩子函数中知道这一点?
$ this-> router-> fetch_class();
扩展CI_Controller,这应该工作。
我不认为钩子是最好的做法,你要在这里实现
你可以尝试以下内容: 您需要创建中间控制器,你会延长,而不是是CI_Controller,将有认证检查和重定向用户右键控制器
一步阅读本教程由jondavidjohn一步创建
http://jondavidjohn.com/blog/2011/01/scalable-login-system-for-codeigniter-ion_auth
你守d能够在10分钟后得到想法
为什么会被认为是不好的做法?根据具体情况,如果一个控制器拥有许多不同认证级别的方法,那么在路由器级别控制它将产生更简洁的代码。 – jjj
无论你只是把身份验证放在控制器的构造函数? 它会在物品实例化时调用,您可以在那里执行检查。 您也可以始终扩展CI_Controller并将逻辑放在那里,以便您可以在那里执行检查(并按照建议使用this-> router-> fetch_class())。
如果你不想去扩展控制器路由,并且我可以在那里看到你的逻辑,那么你必须在这里使用本地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];
在你的自动加载库类扩展是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');
}
}
}
使用ACL库 - >给予角色类型的用户 - >检查角色类型在每一个控制器 - >只允许特定的角色 –