CI框架中通过hook的方式实现简单的权限控制


Posted in PHP onJanuary 07, 2015

根据自己的实际情况,需要两个文件,一个是权限控制类,Acl,另外一个是权限配置的文件acl.php放在了config这个目录下。

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

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

/*

|--------------------------------------------------------------------------

| Enable/Disable System Hooks

|--------------------------------------------------------------------------

|

| If you would like to use the 'hooks' feature you must enable it by

| setting this variable to TRUE (boolean).  See the user guide for details.

|

*/

$config['enable_hooks'] = TRUE;

2、配置hook.php这个文件

/*

| -------------------------------------------------------------------------

| Hooks

| -------------------------------------------------------------------------

| This file lets you define "hooks" to extend CI without hacking the core

| files.  Please see the user guide for info:

|

|    http://codeigniter.com/user_guide/general/hooks.html

|

*/

$hook['post_controller_constructor'] = array(

    'class'    => 'Acl',

    'function' => 'auth',

    'filename' => 'acl.php',

    'filepath' => 'hooks'

);

具体的参数说明可以参看文档的链接地址,这里尤其要注意post_controller_constructor这个值,可以根据情况选择不同的。

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

$config['AUTH'] = array(

    SUPER_ADMIN         => array(

        'admin' => array('index', 'logout'),

    ),

    ADMIN   => array(

        'admin' => array('index', 'logout'),

    ),

    GUEST => array(

        'admin' => array('index', 'logout'),

    ),

);

这里只是我根据自己的情况定义的,不是真实数据,根据自己的情况定。还有主要变量名字要交$config,这样便于加载使用。

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

class Acl {

    private $url_model;

    private $url_method;

    private $CI;

    function Acl()

    {

        $this->CI =& get_instance();

        $this->CI->load->library('session');

        $this->url_model = $this->CI->uri->segment(1);

        $this->url_method = $this->CI->uri->segment(2);

    }

    function auth()

    {

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

        if(empty($user))

            $user->status = 0;

        $this->CI->load->config('acl');

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

        if(in_array($user->status, array_keys($AUTH))){

            $controllers = $AUTH[$user->status];

            if(in_array($this->url_model, array_keys($controllers))){

                if(!in_array($this->url_method, $controllers[$this->url_model])){

                    show_error('您无权访问该功能,该错误已经被记录!点击<a href="'. site_url('admin/logout') .'">返回</a>');

                }

            }else{

                show_error('您无权访问该模块,该错误已经被记录!点击<a href="'. site_url('admin/logout') .'">返回</a>');

            }

        }

        else

            show_error('错误的用户类型,该错误已经被记录!点击<a href="'. site_url('admin/logout') .'">返回</a>');

    }

}

整体上大体是这样的形式,最后还是要根据自己的实际情况来确定。

需要注意的是:

$this->CI =& get_instance();

以上只是实现了简单的权限控制,小伙伴们可以根据自己的需求,自由扩展下吧。

PHP 相关文章推荐
如何在PHP中使用Oracle数据库(1)
Oct 09 PHP
我的论坛源代码(四)
Oct 09 PHP
PHP版 汉字转码的实现详解
Jun 09 PHP
ThinkPHP模板中数组循环实例
Oct 30 PHP
typecho插件编写教程(五):核心代码
May 28 PHP
合格的PHP程序员必备技能
Nov 13 PHP
PHP扩展Memcache分布式部署方案
Dec 06 PHP
PHP+MySQL存储数据常见中文乱码问题小结
Jun 13 PHP
php实现网页端验证码功能
Jul 11 PHP
php删除一个路径下的所有文件夹和文件的方法
Feb 07 PHP
PHP的mysqli_rollback()函数讲解
Jan 23 PHP
Yii框架多语言站点配置方法分析【中文/英文切换站点】
Apr 07 PHP
CI框架中site_url()和base_url()的区别
Jan 07 #PHP
给ECShop添加最新评论
Jan 07 #PHP
php程序总是提示验证码输入有误解决方案
Jan 07 #PHP
WampServer下安装多个版本的PHP、mysql、apache图文教程
Jan 07 #PHP
php中的动态调用实例分析
Jan 07 #PHP
Zend Guard使用指南及问题处理
Jan 07 #PHP
PHP实现检测客户端是否使用代理服务器及其匿名级别
Jan 07 #PHP
You might like
发布一个用PHP fsockopen写的HTTP下载的类
2007/02/22 PHP
php中curl、fsocket、file_get_content三个函数的使用比较
2014/05/09 PHP
微信网页授权(OAuth2.0) PHP 源码简单实现
2016/08/29 PHP
我的Node.js学习之路(二)NPM模块管理
2014/07/06 Javascript
通过JS来动态的修改url,实现对url的增删查改
2014/09/01 Javascript
JavaScript实现简单的二级导航菜单实例
2015/04/15 Javascript
JavaScript数组去重的两种方法推荐
2016/04/05 Javascript
JS函数arguments数组获得实际传参数个数的实现方法
2016/05/28 Javascript
jQuery 自定义下拉框(DropDown)附源码下载
2016/07/22 Javascript
利用bootstrapValidator验证UEditor
2016/09/14 Javascript
ionic2 tabs 图标自定义实例
2017/03/08 Javascript
浅析JS中回调函数及用法
2018/07/25 Javascript
JS散列表碰撞处理、开链法、HashTable散列示例
2019/02/08 Javascript
从组件封装看Vue的作用域插槽的实现
2019/02/12 Javascript
[01:02:26]DOTA2-DPC中国联赛 正赛 SAG vs RNG BO3 第二场 1月18日
2021/03/11 DOTA
[01:05:29]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第二场 1月24日
2021/03/11 DOTA
Python3实现的腾讯微博自动发帖小工具
2013/11/11 Python
Python爬虫框架Scrapy安装使用步骤
2014/04/01 Python
使用python调用zxing库生成二维码图片详解
2017/01/10 Python
Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)
2018/04/30 Python
python global关键字的用法详解
2019/09/05 Python
Python实现爬取网页中动态加载的数据
2020/08/17 Python
Python3如何使用range函数替代xrange函数
2020/10/05 Python
一款纯css3实现的竖形二级导航的实例教程
2014/12/11 HTML / CSS
Jowissa官方网站:瑞士制造的手表,优雅简约的设计
2020/07/29 全球购物
澳大利亚头发和美容产品购物网站:OZ Hair & Beauty
2020/03/27 全球购物
大学生优秀团员事迹材料
2014/01/30 职场文书
数学与统计学院学生个人职业生涯规划书
2014/02/10 职场文书
医药类个人求职的自我评价
2014/02/12 职场文书
检举信的格式及范文
2014/04/04 职场文书
小区物业门卫岗位职责
2014/04/10 职场文书
小学模范班主任事迹材料
2014/05/13 职场文书
治庸问责心得体会
2014/09/12 职场文书
党员对照检查材料思想汇报
2014/09/16 职场文书
Python还能这么玩之只用30行代码从excel提取个人值班表
2021/06/05 Python
MySQL8.0升级的踩坑历险记
2021/11/01 MySQL