没错,这是一篇转过来的文章,因为需要一个简单的权限控制方法,Google查询后找到了通过hook方式控制权限的做法.

Acl这个类放在了application/hook/acl.php。通过application/config/config.php文件开启hook,并且配置config这个目录下的hook.php文件。

1、开启hook功能,config.php这个文件

  1. <?php
  2. $config['enable_hooks'] = TRUE;
  3. ?>

2、配置hook.php这个文件

  1. <?php
  2. $hook['post_controller_constructor'] = array(
  3.     'class'    => 'Acl',  //控制类
  4.     'function' => 'filter',  //控制函数
  5.     'filename' => 'acl.php',  //控制文件
  6.     'filepath' => 'hooks'  //存放路径
  7. );
  8. ?>

3、编写权限配置文件acl.php放在config目录下。

  1. <?php
  2. //游客权限映射
  3. $config['acl']['visitor'] = array(
  4.     '' => array('index'),//首页
  5. //这里表示如一个visitor用户浏览/balance/create这样的额链接时是有权限的,但是浏览/balance/update就没有权限。
  6. //如果需要则应该修改为'balance'=>array('create','update')
  7.     'balance'=>array('create')
  8. );
  9. //管理员
  10. $config['acl']['admin'] = array(
  11.  
  12. );
  13. //-------------配置权限不够的提示信息及跳转url------------------//
  14. $config['acl_info']['visitor'] = array(
  15.     'info' => '需要登录以继续',
  16.     'return_url' => 'user/login'
  17. );
  18.  
  19. $config['acl_info']['more_role'] = array(
  20.     'info' => '需要更高权限以继续',
  21.     'return_url' => 'user/up'
  22. );
  23. ?>

4、编写具体的权限控制Acl类

  1. <?php
  2. class Acl
  3. {
  4.     private $url_model; //所访问的模块,如:music
  5.     private $url_method;//所访问的方法,如:create
  6.     private $url_param; //url所带参数 可能是 1 也可能是 id=1&name=test
  7.     private $CI;
  8.  
  9.     function Acl()
  10.     {
  11.         $this->CI = & get_instance();
  12.         $this->CI->load->library('session');
  13.  
  14.         $url = $_SERVER['PHP_SELF'];
  15.         $arr = explode('/', $url);
  16.         $arr = array_slice($arr, array_search('index.php', $arr) + 1, count($arr));
  17.         $this->url_model = isset($arr[0]) ? $arr[0] : '';
  18.         $this->url_method = isset($arr[1]) ? $arr[1] : 'index';
  19.         $this->url_param = isset($arr[2]) ? $arr[2] : '';
  20.     }
  21.  
  22.     function filter()
  23.     {
  24.         $user = $this->CI->session->userdata('user');
  25.         if (empty($user)) {
  26.         //游客visitor
  27.             $role_name = 'visitor';
  28.         } else {
  29.             $role_name = $user->role;
  30.         }
  31.  
  32.         $this->CI->load->config('acl');
  33.         $acl = $this->CI->config->item('acl');
  34.         $role = $acl[$role_name];
  35.         $acl_info = $this->CI->config->item('acl_info');
  36.  
  37.         if (array_key_exists($this->url_model, $role) && in_array($this->url_method, $role[$this->url_model])) {
  38.             ;
  39.         } else {//无权限,给出提示,跳转url
  40.             $this->CI->session->set_flashdata('info', $acl_info[$role_name]['info']);
  41.             redirect($acl_info[$role_name]['return_url']);
  42.         }
  43.     }
  44. }
  45. ?>

发表评论

电子邮件地址不会被公开。 必填项已用*标注