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跳转页面的几种实现方法详解
Jun 08 PHP
关于php 接口问题(php接口主要也就是运用curl,curl函数)
Jul 01 PHP
PHP开发框架kohana中处理ajax请求的例子
Jul 14 PHP
ThinkPHP表单自动提交验证实例教程
Jul 18 PHP
PHP对象相互引用的内存溢出实例分析
Aug 28 PHP
thinkphp模板的包含与渲染实例分析
Nov 26 PHP
百度工程师讲PHP函数的实现原理及性能分析(三)
May 13 PHP
PHP实现QQ登录实例代码
Jan 14 PHP
PHP判断是否是微信打开,浏览器打开的方法
Mar 14 PHP
使用laravel根据用户类型来显示或隐藏字段
Oct 17 PHP
tp5.1 实现setInc字段自动加1
Oct 18 PHP
在laravel中实现ORM模型使用第二个数据库设置
Oct 24 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
Yii实现文章列表置顶功能示例
2016/10/18 PHP
浅谈PHP的数据库接口和技术
2016/12/09 PHP
PHP获取二叉树镜像的方法
2018/01/17 PHP
一段效率很高的for循环语句使用方法
2007/08/13 Javascript
javascript学习笔记(二十) 获得和设置元素的特性(属性)
2012/06/20 Javascript
[JSF]使用DataModel处理表行事件的实例代码
2013/08/05 Javascript
jquery 列表双向选择器之改进版
2013/08/09 Javascript
js获取当前日期时间及其它操作汇总
2015/04/17 Javascript
Jquery实现弹性滑块滑动选择数值插件
2015/08/08 Javascript
javascript跨域的方法汇总
2015/10/23 Javascript
超漂亮的jQuery图片轮播特效
2015/11/24 Javascript
jQuery Ajax和getJSON获取后台普通json数据和层级json数据用法分析
2016/06/08 Javascript
Seajs是什么及sea.js 由来,特点以及优势
2016/10/13 Javascript
Vue.js基础知识小结
2017/01/13 Javascript
vue中计算属性(computed)、methods和watched之间的区别
2017/07/27 Javascript
tracking.js页面人脸识别插件使用方法
2020/04/16 Javascript
JS使用栈判断给定字符串是否是回文算法示例
2019/03/04 Javascript
leaflet加载geojson叠加显示功能代码
2020/02/21 Javascript
js实现树形数据转成扁平数据的方法示例
2020/02/27 Javascript
详解JavaScript数据类型和判断方法
2020/09/04 Javascript
Python构建网页爬虫原理分析
2017/12/19 Python
python DataFrame获取行数、列数、索引及第几行第几列的值方法
2018/04/08 Python
Python提取支付宝和微信支付二维码的示例代码
2019/02/15 Python
pytorch在fintune时将sequential中的层输出方法,以vgg为例
2019/08/20 Python
python字典和json.dumps()的遇到的坑分析
2020/03/11 Python
Pytorch转keras的有效方法,以FlowNet为例讲解
2020/05/26 Python
Python如何输出整数
2020/06/07 Python
recorder.js 基于Html5录音功能的实现
2020/05/26 HTML / CSS
来自南加州灵感的工作和娱乐服装:TravisMathew
2019/05/01 全球购物
印尼购物网站:iLOTTE
2019/10/16 全球购物
求∏的近似值,直到最后一项的绝对值小于指定的数
2016/02/12 面试题
大二法学专业职业生涯规划范文
2014/02/12 职场文书
论文指导教师评语
2014/04/28 职场文书
奶茶店创业计划书
2014/08/14 职场文书
党的群众路线教育实践活动个人对照检查剖析材料
2014/09/23 职场文书
2016年6.5世界环境日宣传活动总结
2016/04/01 职场文书