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生成便于打印的网页
Oct 09 PHP
php strstr查找字符串中是否包含某些字符的查找函数
Jun 03 PHP
让PHP COOKIE立即生效,不用刷新就可以使用
Mar 09 PHP
PHP判断搜索引擎蜘蛛并自动记忆到文件的代码
Feb 04 PHP
PHP UTF8中文字符截断函数代码
Sep 11 PHP
php如何调用webservice应用介绍
Nov 24 PHP
PHP flush()与ob_flush()的区别详解
Jun 03 PHP
Chrome Web App开发小结
Sep 04 PHP
PHP类的封装与继承详解
Sep 29 PHP
PHP 7.0.2 正式版发布
Jan 08 PHP
PHP+shell脚本操作Memcached和Apache Status的实例分享
Mar 11 PHP
php解决和避免form表单重复提交的几种方法
Aug 31 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
ThinkPHP 3.2 数据分页代码分享
2014/10/14 PHP
ecshop实现smtp发送邮件
2015/02/03 PHP
php实现多站点共用session实现单点登录的方法详解
2019/09/18 PHP
top.location.href 没有权限 解决方法
2008/08/05 Javascript
HTML颜色选择器实现代码
2010/11/23 Javascript
javascript开发技术大全-第1章javascript概述
2011/07/03 Javascript
javascript中获取下个月一号,是星期几
2012/06/01 Javascript
jQuery过滤选择器:not()方法使用介绍
2014/04/20 Javascript
改变状态栏文字的js代码
2014/06/13 Javascript
JS小游戏之象棋暗棋源码详解
2014/09/25 Javascript
js判断一个字符串是否包含一个子串的方法
2015/01/26 Javascript
js的window.showModalDialog及window.open用法实例分析
2015/01/29 Javascript
seajs模块之间依赖的加载以及模块的执行
2016/10/21 Javascript
快速掌握jQuery插件WebUploader文件上传
2016/11/07 Javascript
JavaScript实现垂直向上无缝滚动特效代码
2016/11/23 Javascript
Javascript调试之console对象——你不知道的一些小技巧
2017/07/10 Javascript
微信页面弹出键盘后iframe内容变空白的解决方案
2017/09/20 Javascript
Smartour 让网页导览变得更简单(推荐)
2019/07/19 Javascript
vue实现移动端H5数字键盘组件使用详解
2020/08/25 Javascript
[53:21]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-CDEC
2014/05/22 DOTA
[03:55]TI9战队采访——TNC Predator
2019/08/22 DOTA
基于python yield机制的异步操作同步化编程模型
2016/03/18 Python
浅谈python 里面的单下划线与双下划线的区别
2017/12/01 Python
Python3日期与时间戳转换的几种方法详解
2019/06/04 Python
超实用的 30 段 Python 案例
2019/10/10 Python
python日期与时间戳的各种转换示例
2020/02/12 Python
python3将变量输入的简单实例
2020/08/19 Python
美国快时尚彩妆品牌:Winky Lux(透明花瓣润唇膏)
2018/11/06 全球购物
苏格兰领先的多渠道鞋店:Begg Shoes
2019/10/22 全球购物
工作睡觉检讨书
2014/02/25 职场文书
合作经营协议书
2014/04/17 职场文书
公司党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
关于运动会的宣传稿
2015/07/23 职场文书
如何在centos上使用yum安装rabbitmq-server
2021/03/31 Servers
分析Java中Map的遍历性能问题
2021/06/26 Java/Android
MySQL常用慢查询分析工具详解
2022/08/14 MySQL