两种方法php
方法一,钩子函数:html
一直没找到CI的权限认证扩展,之前好像找到过一个老外的扩展,不过不怎么好用,如今记不清了,后来仿着jsp firter的方式用CI钩子写了一下,感受还能够,作个小网站,小应用足够了,不必搞得太复杂。看到不少人在网上问,这里把咱们的方法分享一下,若是你有更好的实现,也请记得分享给咱们。^_^
一般咱们后台路径看起来都会像下面这样:
http://www.php-chongqing.com/index.php/manage/
http://www.php-chongqing.com/index.php/manage/article/add
http://www.php-chongqing.com/index.php/manage/product/delete/1
http://www.php-chongqing.com/index.php/manage/user
由于CI是MVC的,单一入口,而且给咱们提供了7个挂钩点,一切就很简单了,咱们只须要在CI执行目标控制器方法以前拦截到请求,检查URI是不是以manage开头便可,若是URI以manage开头,就检查用户权限,没有权限就跳转到登录页或是相关的提示页。
一、先到config/config.php中设置容许使用钩子
$config['enable_hooks'] = TRUE;
二、再到config/hooks.php中配置权限认证钩子
$hook['post_controller_constructor'] = array( 'class' => 'ManageAuth', 'function' => 'auth', 'filename' => 'ManageAuth.php', 'filepath' => 'hooks');
须要注意的是必定要使用'post_controller_constructor'挂钩点,由于咱们可能要在ManageAuth中使用CI的aip,链接数据库等。
三、建立ManageAuth.php文件,放到hooks目录下,ManageAuth.php中的代码以下:
/** * * 后台权限拦截钩子 * @link http://www.php-chongqing.com * @author bing.peng * */class ManageAuth { private $CI; public function __construct() { $this->CI = &get_instance(); } /** * 权限认证 */ public function auth() { $this->CI->load->helper('url'); if ( preg_match("/manage.*/i", uri_string()) ) { // 须要进行权限检查的URL $this->CI->load->library('session'); if( !$this->CI->session->userdata('username') ) { // 用户未登录 redirect('login'); return; } } } }
OK,就这样,搞定了,咱们经过正则表达匹配,凡是以manage打头的url都是须要登录后才能访问的。
示例中的权限认证很简单,仅仅只是检查下session是否存有username,若是有就认为用户已登录,能够访问资源,不然就跳转到登录页面。注意登录的url千万不是能以manage开头,不然就重向定死循环了。
若是,你须更复杂的权限认证直接写你本身的认证方法就OK了,好比你使用了用户、角色、资源等等。
这种实现基本能够算做AOP(面向切面编程)了,其实PHP已经有了AOP的雏形,改天用原生PHP的方法拦截,实现一下权限认证。^_^数据库
参考官方文档:http://codeigniter.org.cn/user_guide/general/hooks.html编程
方法二,集成核心Controller:session
<?php
class Extend_Controller extends CI_Controller {
public function __construct() {
parent::__construct();
}
}
查看官方文档:http://codeigniter.org.cn/user_guide/general/core_classes.htmljsp