您的位置:首页 > 其它

CI中利用hook实现用户权限访问

2012-12-12 22:35 507 查看
CI使用hook方法:

1、启用hook,在config.php中设置:

$config['enable_hooks'] = true;


2、定义hook,在application/config/hooks.php中定义钩子

$hook['pre_controller'] = array(
'class'    => 'Acl',//挂钩类名
'function' => 'filter',//过滤函数名
'filename' => 'Acl.php',//挂钩类文件名
'filepath' => 'hooks',//类文件所在文件夹application/hooks
);


3、接下来定义挂钩类,根据上面设置,在application/hooks文件夹中新建一个名为acl.php的文件,然后进行如下设计

class Acl
{
private $url_model;
private $url_method;
private $url_param;

private $CI;

function __construct(){
$this->CI=&get_instance();
$this->CI->load->library('session');

$url=$_SERVER['PHP_SELF'];//得到网址index.php/......
$arr=explode('/',$url);//CI是以'/'隔开网址各个部分

//var_dump($arr);
$arr = array_slice($arr, array_search('index.php', $arr) + 1, count($arr));
//var_dump($arr);

$this->url_model=empty($arr[0])?'user':$arr[0];//如果控制器没有 就设置为空
$this->url_method=empty($arr[1])?'index':$arr[1];//如果没有方法 则为index方法
$this->url_param=empty($arr[2])?'':$arr[2];//如果没定义 则表示没有参数
}
function filter(){

$user=$this->CI->session->userdata('username');

if(!empty($user)){
$role_name='user';//此处应该根据权限读取角色
}else{
$role_name='visitor';
}

$this->CI->config->load('acl');//此处是config用法 注意
$acl=$this->CI->config->item('acl');

$role=$acl[$role_name];

$acl_info = $this->CI->config->item('acl_info');

if(array_key_exists($this->url_model,$role)&&in_array($this->url_method, $role[$this->url_model])){
;
}else{
//无权限,给出提示,跳转url
$this->CI->session->set_flashdata('info', $acl_info[$role_name]['info']);
$this->CI->session->set_flashdata('return_url',$acl_info[$role_name]['return_url']);
redirect("user/error/");
}

}
}


4、由于第三步里面用到了配置文件,所以要在application/config中新建一个acl.php用来存放一些配置信息,代码如下

<?php
/*
ACL相关配置
*/
$config['acl']['visitor']=array(

''=>'index',
'user'=>array('index','error','check_login','logout','ceshi'),
'upload'=>array('do_upload'),
'easyui'=>array('panel','table'),
);
$config['acl']['user']=array(
''=>'index',
'user'=>array('index','main','error','excel_to_mysql','get_progress','destory_progress','kaoshi'),
'upload'=>array('index','do_upload'),

);

$config['acl_info']['visitor']=array(
'info'=>'登录之后才能使用',
'return_url'=>'user/index'
);

$config['acl_info']['user']=array(
'info'=>'没有这个操作啦!!',
'return_url'=>'user/main'

);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐