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中通过正则表达式下载内容中的远程图片的函数代码
Jan 10 PHP
解析func_num_args与func_get_args函数的使用
Jun 24 PHP
PHP中遇到BOM、编码导致json_decode函数无法解析问题
Jul 02 PHP
ThinkPHP控制器间实现相互调用的方法
Oct 31 PHP
PHP动态页生成静态页的3种常用方法
Nov 13 PHP
PHP中上传多个文件的表单设计例子
Nov 19 PHP
php实现用于计算执行时间的类实例
Apr 18 PHP
Zend Framework入门教程之Zend_Db数据库操作详解
Dec 08 PHP
ThinkPHP实现生成和校验验证码功能
Apr 28 PHP
PHP调用接口用post方法传送json数据的实例
May 31 PHP
php使用curl获取header检测开启GZip压缩的方法
Aug 15 PHP
php使用redis的有序集合zset实现延迟队列应用示例
Feb 20 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
PHPMYADMIN 简明安装教程 推荐
2010/03/07 PHP
详解在PHP的Yii框架中使用行为Behaviors的方法
2016/03/18 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
2017/11/12 PHP
php使用curl伪造来源ip和refer的方法示例
2018/05/08 PHP
php中isset与empty函数的困惑与用法分析
2019/07/05 PHP
用JavaScript编写COM组件的步骤
2009/03/17 Javascript
extjs之去除s.gif的影响
2010/12/25 Javascript
js获取指定日期周数以及星期几的小例子
2014/06/27 Javascript
一个简单的全屏图片上下打开显示网页效果示例
2014/07/08 Javascript
JavaScript中跨域调用Flash的方法
2014/08/11 Javascript
jQuery遮罩层实现方法实例详解(附遮罩层插件)
2015/12/08 Javascript
Bootstrap表单布局样式代码
2016/05/31 Javascript
AngularJS实现根据变量改变动态加载模板的方法
2016/11/04 Javascript
jQuery用户头像裁剪插件cropbox.js使用详解
2017/06/07 jQuery
jQuery动画_动力节点节点Java学院整理
2017/07/04 jQuery
react 父组件与子组件之间的值传递的方法
2017/09/14 Javascript
解决百度Echarts图表坐标轴越界的方法
2018/10/17 Javascript
jQuery实现鼠标滑动切换图片
2020/05/27 jQuery
JS将指定的某个字符全部转换为其他字符实例代码
2020/10/13 Javascript
python引入不同文件夹下的自定义模块方法
2018/10/27 Python
python批量爬取下载抖音视频
2019/06/17 Python
教你一步步利用python实现贪吃蛇游戏
2019/06/27 Python
Django中如何使用sass的方法步骤
2019/07/09 Python
Python3 itchat实现微信定时发送群消息的实例代码
2019/07/12 Python
PyQt5的相对布局管理的实现
2020/08/07 Python
opencv python 对指针仪表读数识别的两种方式
2021/01/14 Python
全球才华横溢工匠的家居装饰、珠宝和礼物:NOVICA
2021/01/22 全球购物
暑期社会实践学生的自我评价
2014/01/09 职场文书
高中竞选班长演讲稿
2014/04/24 职场文书
实践单位评语
2014/04/26 职场文书
中班幼儿评语大全
2014/04/30 职场文书
詹天佑教学反思
2014/04/30 职场文书
高中班级口号
2014/06/09 职场文书
中学生2014国庆节演讲稿:不屈的民族
2014/09/21 职场文书
教师个人学习总结
2015/02/11 职场文书
四群教育工作总结
2015/08/10 职场文书