利用CI钩子实现权限认证 session

钩子(hook)作用是:在目标控制器方法调用之前拦截到请求,也是在执行了构造方法后,调用控制器之前执行的程序

一直没找到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开头,就检查用户权限,没有权限就跳转到登陆页或是相关的提示页。


1、先到config/config.php中设置允许使用钩子

$config [ 'enable_hooks' ]   =  TRUE ;
2、再到config/hooks.php中配置权限认证钩子

$hook [ 'post_controller_constructor' ]   =  array (      'class'      =>   'ManageAuth' ,      'function'   =>   'auth' ,      'filename'   =>   'ManageAuth.php' ,      'filepath'   => 'hooks' );
需要注意的是一定要使用'post_controller_constructor'挂钩点,因为我们可能要在ManageAuth中使用CI的aip,连接数据库等。

转自:http://codeigniter.org.cn/forums/thread-10877-1-1.html


3、创建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的方法拦截,实现一下权限认证。^_^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值