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和ACCESS写聊天室(八)
Oct 09 PHP
MySQL时间字段究竟使用INT还是DateTime的说明
Feb 27 PHP
浅谈PHP强制类型转换,慎用!
Jun 06 PHP
PHP 使用MySQL管理Session的回调函数详解
Jun 21 PHP
php stream_get_meta_data返回值
Sep 29 PHP
PHP实现对二维数组某个键排序的方法
Sep 14 PHP
CI框架实现框架前后端分离的方法详解
Dec 30 PHP
php+webSoket实现聊天室示例代码(附源码)
Feb 17 PHP
yii2学习教程之5种内置行为类详解
Aug 03 PHP
php实现每日签到功能
Nov 29 PHP
php 多继承的几种常见实现方法示例
Nov 18 PHP
设定php简写功能的方法
Nov 28 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
利用phpexcel把excel导入数据库和数据库导出excel实现
2014/01/09 PHP
Yii2 rbac权限控制之rule教程详解
2016/06/23 PHP
javascript之卸载鼠标事件的代码
2007/05/14 Javascript
javascript中不等于的代码是什么怎么写
2013/12/29 Javascript
js弹出确认是否删除对话框
2014/03/27 Javascript
javascript入门教程基础篇
2015/11/16 Javascript
js定时器实例分享
2016/12/20 Javascript
html5 canvas 详细使用教程
2017/01/20 Javascript
原生JS+Canvas实现五子棋游戏
2020/05/28 Javascript
使用veloticy-ui生成文字动画效果
2018/02/08 Javascript
JS实现的全选、全不选及反选功能【案例】
2019/02/19 Javascript
详解NodeJS Https HSM双向认证实现
2019/03/12 NodeJs
Vue infinite update loop的问题解决
2019/04/23 Javascript
vue同个按钮控制展开和折叠同个事件操作
2020/07/29 Javascript
arcgis.js控制地图地体的显示范围超出区域自动弹回(实现思路)
2021/01/28 Javascript
pyqt4教程之widget使用示例分享
2014/03/07 Python
Python实现删除Android工程中的冗余字符串
2015/01/19 Python
Python中Selenium模拟JQuery滑动解锁实例
2017/07/26 Python
解决pyinstaller打包pyqt5的问题
2019/01/08 Python
Python PIL读取的图像发生自动旋转的实现方法
2019/07/05 Python
Python 获取windows桌面路径的5种方法小结
2019/07/15 Python
python实现tail实时查看服务器日志示例
2019/12/24 Python
Python的pygame安装教程详解
2020/02/10 Python
使用python绘制cdf的多种实现方法
2020/02/25 Python
浅谈Django前端后端值传递问题
2020/07/15 Python
使用纯 CSS 创作一个脉动 loader效果的源码
2018/09/28 HTML / CSS
Europcar德国:全球汽车租赁领域的领导者
2018/08/15 全球购物
二年级评语大全
2014/04/23 职场文书
如何写求职信
2014/05/24 职场文书
走进敬老院活动总结
2014/07/10 职场文书
销售人员求职信
2014/07/22 职场文书
授权委托书
2014/09/17 职场文书
化验员岗位职责
2015/02/14 职场文书
小学班主任个人总结
2015/03/03 职场文书
九年级数学教学反思
2016/02/17 职场文书
Redis 配置文件重要属性的具体使用
2021/05/20 Redis