用户
 找回密码
 入住 CI 中国社区
搜索
查看: 18404|回复: 18
收起左侧

[核心代码 Core] 在CI 中实现ACL

    [复制链接]
发表于 2009-12-26 16:41:54 | 显示全部楼层 |阅读模式
最近尝试了一下在CI中实现ACL ,只是说明思想,思维不一定太严谨,供参考
(1) system/application/hooks 中新增文件acl.php
PHP复制代码
<?php
//stone.pei added. acl hook.
function hook_acl()
{
        global $RTR;
        $controller = $RTR->class;
        $method = $RTR->method;
        //load acl config files
        $config = & load_class('Config');
        $config->load('acl',true,true);
        $acl_settings = $config->item('acl');
        $acl_tables = $acl_settings['acl'];
        //get current user level  eg : $_COOKIE['user_role'] = 'admin'
        $current_role = (isset($_COOKIE['user_role']))? $_COOKIE['user_role'] : 'guest' ;
        if(isset($acl_tables[$controller][$method])){
                //begin to check acl
                $allow_roles = $acl_tables[$controller][$method];
                if(!in_array($current_role,$allow_roles)){
                        show_error('No Right To Access',500);
                }
        }
       
       
}
?>
复制代码

(2) 在system/application/config/下添加文件 acl.php 用作配置文件
PHP复制代码
<?php
 /**
  * stone.pei added
  * used to config acl
  */

  //acl table
  //format
  /*$acl = array(
        'controll_1' =>array(
                'method_1' => array('super admin','admin','register'), //who can access this method.
                'method_2' => array('admin'),
    ),
    'controll_2' =>array(
                'method_1' => array('super admin','admin','register'), //who can access this method.
                'method_2' => array('admin','guest'), // no definition: no access limit.
    ),
  );*/

  $acl = array(
        'blog' => array(
                'add' => array('admin','register'),
                'html_all' => array('admin'),
                'remove_all' => array('admin'),
        ),
       
  );
 
  //set config
  $config['acl'] = $acl;
?>
复制代码

(3) system/application/config/hooks.php中添加
PHP复制代码
$hook['pre_controller'] = array(
                'function' => 'hook_acl',
                'filename'=> 'acl.php',
                'filepath' => 'hooks',
                'params' => array(),
);
复制代码


说明:此方法方便,低耦合,无需要修改controller 及method.
可以随时启用ACL 或变更ACL.

评分

参与人数 1威望 +5 收起 理由
Hex + 5 原创内容

查看全部评分

发表于 2014-8-26 10:42:51 | 显示全部楼层
jufengdhj 发表于 2010-1-27 21:51
很好,我也想这样的。谢谢
另外可以把aclconfig存进数据库,这样以后再admin中可以动态的改变授权了。 ...

求助,如何把aclconfig存进数据库
发表于 2014-8-26 10:45:55 | 显示全部楼层
求助,如何把aclconfig存进数据库
发表于 2009-12-26 17:21:09 | 显示全部楼层
加分!最近难得一见的好帖~
发表于 2010-1-22 16:30:25 | 显示全部楼层
确实是好贴,很不错
发表于 2010-1-27 21:51:33 | 显示全部楼层
很好,我也想这样的。谢谢
另外可以把aclconfig存进数据库,这样以后再admin中可以动态的改变授权了。
发表于 2010-3-3 00:13:01 | 显示全部楼层
多谢分享
发表于 2010-3-5 17:43:28 | 显示全部楼层
这个果然很强大。
传说的AOP
发表于 2010-3-6 16:01:10 | 显示全部楼层
我的问题是,使用$_COOKIE能取到值吗?然后ci好象会加密cookis的内容。这个比较可以成功吗?
有知道的人说一下。
谢谢
发表于 2010-9-14 02:10:06 | 显示全部楼层
BUG,BUG,发现bug。URL中,如果控制器或者Action写成大写可以瞒过验证。比如楼主的Blog/Add就会失效。本人做了一下小小修改。     
$controller = strtolower($RTR->class);
$method = strtolower($RTR->method);
并且ACL配置文件中的controller以及action必须写成小写~~
其实就是 统一一下字符大小写~
再有使用者请注意
发表于 2011-10-1 13:33:07 | 显示全部楼层
一个基于zendacl 的收费权限系统 值得参考
开发文档: http://applications.schizzoweb.com/cizacl/user_guide/
演示地址: http://applications.schizzoweb.com/cizacl/index.php/view
用户:admin
密码:admin
发表于 2012-1-14 17:46:08 | 显示全部楼层
小言 发表于 2011-10-1 13:33
一个基于zendacl 的收费权限系统 值得参考
开发文档: http://applications.schizzoweb.com/cizacl/user_gui ...

看看去,嘿嘿

本版积分规则