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,不用COM,生成excel文件
Oct 09 PHP
php采集速度探究总结(原创)
Apr 18 PHP
用PHP连接MySQL代码的参数说明
Jun 07 PHP
php网站判断用户是否是手机访问的方法
Nov 01 PHP
php将图片保存为不同尺寸图片的图片类实例
Mar 30 PHP
PHP获取photoshop写入图片文字信息的方法
Mar 31 PHP
iOS10推送通知开发教程
Sep 19 PHP
PHP fclose函数用法总结
Feb 15 PHP
ThinkPHP中图片按比例切割的代码实例
Mar 08 PHP
Yii使用EasyWechat实现小程序获取用户的openID的方法
Apr 29 PHP
详解PHP中curl_multi并发的实现
Jun 08 PHP
php中try catch捕获异常实例详解
Aug 06 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使用cookie实现记住用户名和密码实现代码
2015/04/27 PHP
Codeigniter的dom类用法实例
2015/06/26 PHP
Laravel 读取 config 下的数据方法
2019/10/13 PHP
自己整理的一个javascript日期处理函数
2010/10/16 Javascript
自己动手制作jquery插件之自动添加删除行功能介绍
2011/10/14 Javascript
JavaScript实现复制或剪切内容到剪贴板功能的方法
2016/05/23 Javascript
jQuery EasyUI菜单与按钮详解
2016/07/13 Javascript
基于jQuery和Bootstrap框架实现仿知乎前端动态列表效果
2016/11/09 Javascript
JavaScript中动态向表格添加数据
2017/01/24 Javascript
Nodejs高扩展性的模板引擎 functmpl简介
2017/02/13 NodeJs
原生js实现倒计时--2018
2017/02/21 Javascript
vue模板语法-插值详解
2017/03/06 Javascript
nodejs连接mysql数据库简单封装示例-mysql模块
2017/04/10 NodeJs
JavaScript基于数组实现的栈与队列操作示例
2018/12/22 Javascript
JavaScript实现五子棋游戏的方法详解
2019/07/08 Javascript
layui数据表格 table.render 报错的解决方法
2019/09/29 Javascript
利用js canvas实现五子棋游戏
2020/10/11 Javascript
pygame 精灵的行走及二段跳的实现方法(必看篇)
2017/07/10 Python
Python实现求解括号匹配问题的方法
2018/04/17 Python
python正则表达式匹配[]中间为任意字符的实例
2018/12/25 Python
Python高斯消除矩阵
2019/01/02 Python
python中前缀运算符 *和 **的用法示例详解
2020/05/28 Python
python字典与json转换的方法总结
2020/12/28 Python
用css3制作纸张效果(外翻卷角)
2013/02/01 HTML / CSS
努比亚手机官网:nubia
2016/10/06 全球购物
拥有超过850家商店的美国在线派对商店:Party City
2018/10/21 全球购物
澳大利亚网上买书:Angus & Robertson
2019/07/21 全球购物
TUMI香港官网:国际领先的行李箱、背囊品牌
2021/03/01 全球购物
C++:memset ,memcpy和strcpy的根本区别
2013/04/27 面试题
先进班级集体事迹材料
2014/01/30 职场文书
同事吵架检讨书
2014/02/05 职场文书
欢迎领导标语
2014/06/27 职场文书
2015年宣传部部长竞选演讲稿
2014/11/28 职场文书
信息技术远程培训心得体会
2016/01/09 职场文书
《迟到》教学反思
2016/02/24 职场文书
使用react+redux实现计数器功能及遇到问题
2021/06/02 Javascript