lovelvaly 发表于 2009-12-26 16:41:54

在CI 中实现ACL

最近尝试了一下在CI中实现ACL ,只是说明思想,思维不一定太严谨,供参考
(1) system/application/hooks 中新增文件acl.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 leveleg : $_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
/**
* 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中添加
$hook['pre_controller'] = array(
                'function' => 'hook_acl',
                'filename'=> 'acl.php',
                'filepath' => 'hooks',
                'params' => array(),
);

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

xiaoyadan430 发表于 2014-8-26 10:42:51

jufengdhj 发表于 2010-1-27 21:51
很好,我也想这样的。谢谢
另外可以把aclconfig存进数据库,这样以后再admin中可以动态的改变授权了。 ...

求助,如何把aclconfig存进数据库

xiaoyadan430 发表于 2014-8-26 10:45:55

求助,如何把aclconfig存进数据库

Hex 发表于 2009-12-26 17:21:09

加分!最近难得一见的好帖~

haohailuo 发表于 2010-1-22 16:30:25

确实是好贴,很不错

jufengdhj 发表于 2010-1-27 21:51:33

很好,我也想这样的。谢谢
另外可以把aclconfig存进数据库,这样以后再admin中可以动态的改变授权了。

荒野无灯 发表于 2010-3-3 00:13:01

多谢分享:lol

shinelake 发表于 2010-3-5 17:43:28

这个果然很强大。
传说的AOP

shinelake 发表于 2010-3-6 16:01:10

我的问题是,使用$_COOKIE能取到值吗?然后ci好象会加密cookis的内容。这个比较可以成功吗?
有知道的人说一下。
谢谢

guangzhejiao 发表于 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 static/image/common/back.gif
一个基于zendacl 的收费权限系统 值得参考
开发文档: http://applications.schizzoweb.com/cizacl/user_gui ...

看看去,嘿嘿
页: [1] 2
查看完整版本: 在CI 中实现ACL