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作为Shell脚本语言使用
Oct 09 PHP
PHP获取表单所有复选框的值的方法
Aug 28 PHP
php中文繁体和简体相互转换的方法
Mar 21 PHP
利用“多说”制作留言板、评论系统
Jul 14 PHP
PHP 绘制网站登录首页图片验证码
Apr 12 PHP
PHP多进程编程总结(推荐)
Jul 18 PHP
PHP中TP5 上传文件的实例详解
Jul 31 PHP
PHP实现上传图片到数据库并显示输出的方法
May 31 PHP
PHP数据对象映射模式实例分析
Mar 29 PHP
PHP call_user_func和call_user_func_array函数的简单理解与应用分析
Nov 25 PHP
php使用redis的几种常见操作方式和用法示例
Feb 20 PHP
php实现简单四则运算器
Nov 29 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
真正面向对象编程:PHP5.01发布
2006/10/09 PHP
PHP中静态变量的使用方法实例分析
2016/12/01 PHP
基于jQuery的公告无限循环滚动实现代码
2012/05/11 Javascript
node.js中的console.log方法使用说明
2014/12/09 Javascript
JavaScript中的事件委托及好处
2016/07/12 Javascript
js对字符串进行编码的方法总结(推荐)
2016/11/10 Javascript
用JavaScript实现让浏览器停止载入页面的方法
2017/01/19 Javascript
javascript闭包功能与用法实例分析
2017/04/06 Javascript
如何将 jQuery 从你的 Bootstrap 项目中移除(取而代之使用Vue.js)
2017/07/17 jQuery
详解vue-cli中的ESlint配置文件eslintrc.js
2017/09/25 Javascript
JS中Attr的用法详解
2017/10/09 Javascript
vue.js开发实现全局调用的MessageBox组件实例代码
2017/11/22 Javascript
基于vue打包后字体和图片资源失效问题的解决方法
2018/03/06 Javascript
Webpack中雪碧图插件使用详解
2018/05/25 Javascript
vue2.0学习之axios的封装与vuex介绍
2018/05/28 Javascript
使用vue-cli webpack 快速搭建项目的代码
2018/11/21 Javascript
深入理解 TypeScript Reflect Metadata
2019/12/12 Javascript
微信小程序实现二维码签到考勤系统
2020/01/16 Javascript
微信小程序仿淘宝热搜词在搜索框中轮播功能
2020/01/21 Javascript
原生JS实现拖拽功能
2020/12/16 Javascript
Vue包大小优化的实现(从1.72M到94K)
2021/02/18 Vue.js
Python模仿POST提交HTTP数据及使用Cookie值的方法
2014/11/10 Python
Python3 模块、包调用&amp;路径详解
2017/10/25 Python
详解Python最长公共子串和最长公共子序列的实现
2018/07/07 Python
python保存网页图片到本地的方法
2018/07/24 Python
详解Python下Flask-ApScheduler快速指南
2018/11/04 Python
python按修改时间顺序排列文件的实例代码
2019/07/25 Python
基于Python新建用户并产生随机密码过程解析
2019/10/08 Python
Python基于pandas绘制散点图矩阵代码实例
2020/06/04 Python
Python调用ffmpeg开源视频处理库,批量处理视频
2020/11/16 Python
致跳远、跳高运动员广播稿
2014/01/09 职场文书
学生爱国演讲稿
2014/01/14 职场文书
环境保护标语
2014/06/20 职场文书
单身申明具结书
2015/02/26 职场文书
2015年小学语文工作总结
2015/05/25 职场文书
python机器学习创建基于规则聊天机器人过程示例详解
2021/11/02 Python