Tag CodeIgniter  Zend Acl 权限控制

1、 Zend_Acl简介

Zend_Acl 为权限管理提供轻量并灵活的访问控制列表 (ACL,access control list) 的实现。一般地,应用软件可以利用这样的功能限制某些特定对象来访问特定保护的对象。

resource (资源)是一个限制访问的对象。 在 Zend_Acl 中,创建一个 resource 非常简单。Zend_Acl 提供了 resource接口Zend_Acl_Resource_Interface 使开发者在程序中创建 resources 非常容易。

role (角色)是一个可以发出请求去访问Resource的对象。像 Resources 一样,创建一个 role 也非常简单。 Zend_Acl提供了 Zend_Acl_Role_Interface 使开发者创建 roles 非常容易。

通过规范和访问控制列表(ACL)的使用,应用软件可以控制角色(roles)如何来访问资源(resources)。

2、 CodeIgniter设置

解压ZendAcl目录,放置在system/libraries/中如下图所示:

其中包含Acl.php和Excetion.php两个必须文件,以及Acl权限控制文件。当然,修改文件包含为绝对路径。例如:Acl.php中的包含文件修改为:

require_once BASEPATH.'/libraries/zend/Acl/Resource/Interface.php';

require_once BASEPATH.'/libraries/zend/Acl/role.php';

require_once BASEPATH.'/libraries/zend/Acl/Resource.php';

下面我们在application/libraries/中写下我们自己的library—Acl.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

/*

* library Acl

* @auth Liuguoqing

* date 20091225

* Using the Zend Framework ACL Library in Codeigniter

* Acl.php

* $roles :角色

* $resources: 资源

* $permissions: 权限

*/

require_once BASEPATH .'libraries/zend/Acl.php';

class CI_Acl extends Zend_Acl {

/*

* 初始化Acl

*/

function __construct() {

$CI = &get_instance();

$this->acl = new Zend_Acl();

//获取角色

$CI->db->order_by('ParentId', 'ASC');

$query = $CI->db->get('cw_roles');

$roles = $query->result();

//获取资源

$CI->db->order_by('parentId', 'ASC');

$query = $CI->db->get('cw_resources');

$resources = $query->result();

//获取权限

$query = $CI->db->get('cw_permissions');

$permissions = $query->result();

//Add the roles to the ACL

foreach ($roles as $roles) {

$role = new Zend_Acl_Role($roles->id);

$roles->parentId != null ?

$this->acl->addRole($role,$roles->parentId):

$this->acl->addRole($role);

}

//Add the resources to the ACL

foreach($resources as $resources) {

$resource = new Zend_Acl_Resource($resources->id);

$resources->parentId != null ?

$this->acl->add($resource, $resources->parentId):

$this->acl->add($resource);

}

//Add the permissions to the ACL

foreach($permissions as $perms) {

$perms->read == '1' ?

$this->acl->allow($perms->role, $perms->resource, 'read') :

$this->acl->deny($perms->role, $perms->resource, 'read');

$perms->write == '1' ?

$this->acl->allow($perms->role, $perms->resource, 'write') :

$this->acl->deny($perms->role, $perms->resource, 'write');

$perms->modify == '1' ?

$this->acl->allow($perms->role, $perms->resource, 'modify') :

$this->acl->deny($perms->role, $perms->resource, 'modify');

$perms->publish == '1' ?

$this->acl->allow($perms->role, $perms->resource, 'publish') :

$this->acl->deny($perms->role, $perms->resource, 'publish');

$perms->delete == '1' ?

$this->acl->allow($perms->role, $perms->resource, 'delete') :

$this->acl->deny($perms->role, $perms->resource, 'delete');

}

//Change this to whatever id your adminstrators group is

//管理员默认拥有所有权限

$this->acl->allow('1');

}

/*

* Methods to query the ACL.

*/

function can_read($role, $resource) {

return $this->acl->isAllowed($role, $resource, 'read')? TRUE : FALSE;

}

function can_write($role, $resource) {

return $this->acl->isAllowed($role, $resource, 'write')? TRUE : FALSE;

}

function can_modify($role, $resource) {

return $this->acl->isAllowed($role, $resource, 'modify')? TRUE : FALSE;

}

function can_delete($role, $resource) {

return $this->acl->isAllowed($role, $resource, 'delete')? TRUE : FALSE;

}

function can_publish($role, $resource) {

return $this->acl->isAllowed($role, $resource, 'publish')? TRUE : FALSE;

}

}

至此,我们就可以在controller中加载自己的类库实现权限控制了。但是我们发现还是不很方便,为此我们可以再添加一个zendacl_helper:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

/**

* ZendAcl Helper

*

* Contains shortcuts to well used Userlib functions

* Using the Zend Framework ACL Library in Codeigniter

@package         CentWare

@subpackage    Helpers

@author          Liu Guoqing

@copyright       Copyright (c) 2010

@license

@link

@filesource

*/

// ---------------------------------------------------------------------------

/*

*

* check_acl

* check_acl 权限控制设置

* $resource 资源

* $action   动作

* @author Liuguoqing

*/

if( ! function_exists('check_acl'))

{

function check_acl($resource,$action=NULL)

{

$CI = & get_instance();

$role=$CI->session->userdata('Roelid');

if($action=='read'){

return $CI->acl->can_read($role, $resource);

}

if($action=='add'){

return $CI->acl->can_write($role, $resource);

}

if($action=='modify'){

return $CI->acl->can_modify($role, $resource);

}

if($action=='delete'){

return $CI->acl->can_delete($role, $resource);

}

if($action=='publish'){

return $CI->acl->can_publish($role, $resource);

}

return FALSE;

}

}

/* End of file zendacl_helper.php */

/* Location: ./helpers/zendacl_helper.php */

总结:ZendAcl用于控制权限角色非常方便……如有不明之处请与本人联系。

QQ603031225 DJBLOGhttp://hi.baidu.com/850317

3、 服数据库结构表:

SQl:--

-- 表的结构 `ci_sessions`

--

 

CREATE TABLE IF NOT EXISTS `ci_sessions` (

  `session_id` varchar(40) character set latin1 NOT NULL default '0',

  `ip_address` varchar(16) character set latin1 NOT NULL default '0',

  `user_agent` varchar(50) character set latin1 NOT NULL,

  `user_data` text NOT NULL,

  `last_activity` int(10) unsigned NOT NULL default '0',

  PRIMARY KEY  (`session_id`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--

-- 表的结构 `cw_permissions`

--

 

CREATE TABLE IF NOT EXISTS `cw_permissions` (

  `id` int(11) NOT NULL auto_increment,

  `role` int(11) default NULL COMMENT '角色',

  `resource` int(11) default NULL COMMENT '资源',

  `read` tinyint(1) default '0',

  `write` tinyint(1) default '0',

  `modify` tinyint(1) default '0',

  `delete` tinyint(1) default '0',

  `publish` tinyint(1) default '0',

  `description` varchar(255) collate utf8_bin default NULL COMMENT '描述',

  PRIMARY KEY  (`id`)

) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1 ;

--

-- 表的结构 `cw_resources`

--

 

CREATE TABLE IF NOT EXISTS `cw_resources` (

  `id` int(11) NOT NULL auto_increment,

  `name` varchar(255) collate utf8_bin default NULL COMMENT '名称',

  `description` varchar(255) collate utf8_bin default NULL COMMENT '描述',

  `parentId` int(11) default NULL COMMENT '父类ID',

  PRIMARY KEY  (`id`)

) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1 ;

--

-- 表的结构 `cw_roles`

--

 

CREATE TABLE IF NOT EXISTS `cw_roles` (

  `id` int(11) NOT NULL auto_increment,

  `name` varchar(255) collate utf8_bin NOT NULL,

  `description` varchar(255) collate utf8_bin default NULL,

  `date` datetime NOT NULL COMMENT '日期',

  `parentId` int(11) default NULL,

  PRIMARY KEY  (`id`)

) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1 ;

--

-- 表的结构 `cw_users`

--

 

CREATE TABLE IF NOT EXISTS `cw_users` (

  `id` int(10) unsigned NOT NULL auto_increment,

  `username` varchar(32) NOT NULL,

  `password` varchar(40) NOT NULL,

  `email` varchar(254) NOT NULL,

  `active` tinyint(1) unsigned NOT NULL default '0',

  `roles` int(10) unsigned default NULL,

  `activation_key` varchar(32) default NULL,

  `last_visit` timestamp NULL default CURRENT_TIMESTAMP,

  `created` datetime NOT NULL,

  `modified` datetime default NULL,

  PRIMARY KEY  (`id`),

  UNIQUE KEY `username` (`username`),

  UNIQUE KEY `email` (`email`),

  KEY `password` (`password`),

  KEY `group` (`roles`)

) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

[转]CodeIgniter与Zend Acl结合实现轻量级权限控制的更多相关文章

  1. CodeIgniter与Zend Acl结合实现轻量级权限控制

    CodeIgniter与Zend Acl结合实现轻量级权限控制 Tag :CodeIgniter Zend Acl 权限控制 1. Zend_Acl简介 Zend_Acl 为权限管理提供轻量并灵活的访 ...

  2. zookeeper ACL(access control lists)权限控制

    基本作用:        针对节点可以设置 相关读写等权限,目的为了保障数据安全性        权限permissions可以制定不同的权限范围以及角色 一:ACL构成         zk的acl ...

  3. **CodeIgniter通过hook的方式实现简单的权限控制

    根据自己的实际情况,需要两个文件,一个是权限控制类,Acl,另外一个是权限配置的文件acl.php放在了config这个目录下. Acl这个类放在了application/hook/acl.php.通 ...

  4. 轻量级权限管理系统(renren-security)

    renren-security是一个轻量级权限管理系统,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.使用renren-security搭建项目,只需编写30%左右代码,其余的代码交给系统自动生 ...

  5. phalcon: acl权限控制

    目录控制: public/index.php: $di['aclResource']=function(){ return include_once '../app/config/frontbackA ...

  6. linux下通过acl配置灵活目录文件权限(可用于ftp,web服务器的用户权限控制)

    linux下通过acl配置灵活目录文件权限(可用于ftp,web服务器的用户权限控制) 发表于2012//07由feng linux 本身的ugo rwx的权限,对于精确的权限控制很是力不从心的,ac ...

  7. zookeeper的ACL权限控制

    ACL:Access Control List  访问控制列表 1.  简介 0.概述 ACL 权限控制,使用:scheme:id:perm 来标识,主要涵盖 3 个方面: 权限模式(Scheme): ...

  8. Linux系统——ACL权限控制及特殊权限

    ACL权限控制 ACL(access control list),可以提供除属主.属组.其他人的rwx权限之外的细节权限设定 ACL的权限控制 (1)User 使用者 (2)Group 群组 (3)M ...

  9. phalcon: 目录分组后的acl权限控制

    phalcon: 目录分组后的acl权限控制 楼主在做acl权限的时候,发现官方的acl只能针对未分组的目录,如下: app/ ___|./controller ___|./logic ___|./p ...

随机推荐

  1. Unity 3D 动画帧事件

    前几天在项目开发中碰到一个这样的需求,RPG游戏中,特效和动画播放不同步的.假如主角在攻击NPC时,先实例化特效,后播放动画.动画毕竟是有一个时间长度的.等到动画播放攻击挥刀的那一瞬间时,特效可能早就 ...

  2. SqlBulkCopy使用心得 (大量数据导入)

    文章转载原地址:http://www.cnblogs.com/mobydick/archive/2011/08/28/2155983.html 最近做的项目由于之前的设计人员懒省事,不按照范式来,将一 ...

  3. (转)单例模式(Singleton)

    首先来明确一个问题,那就是在某些情况下,有些对象,我们只需要一个就可以了, 比如,一台计算机上可以连好几个打印机,但是这个计算机上的打印程序只能有一个, 这里就可以通过单例模式来避免两个打印作业同时输 ...

  4. Activity-在ListFragment中为ListView增加空白视图

     有两种方法可以实现为ListView添加空白视图.但是原理都一样: 第一种方法是XML+代码添加: 1.定义emptyView视图 2.调用AdapterView的setEmptyView(empt ...

  5. Android与JS混编(js调用android相机扫描二维码)

    参考demo http://www.cnblogs.com/mythou/p/3280023.html        项目源码: https://github.com/weifengzz/Androi ...

  6. 全世界最详细的图形化VMware中linux环境下oracle安装(三)【weber出品必属精品】

    数据库软件和数据库都建好了,基本上可以说完成90%的工作,但是美中不足的就是企业管理器还没有安装好,现在我们就开始安装企业管理器吧. 安装之前我们先将补丁给补上.补丁我们也是采用禁默安装.补丁:p83 ...

  7. mysql查询分组归类函数-group_concat,通常与group_by一起使用

    select a.`name`,group_concat(b.name SEPARATOR'.') as persons from `group` as a,`person` as b,`person ...

  8. Objective-C中的单例模式(工具类)

    单例是iOS开发中经常会用到的一种设计模式,顾名思义,即创建一个类,该类在整个程序的生命周期中只有一个实例对象,无论是通过new,alloc init,copy等方法创建,或者创建多少个对象,自始至终 ...

  9. CODEVS 3279 奶牛的健美操

    3279 奶牛健美操 USACO  时间限制: 2 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题目描述 Description Farmer John为了保持奶牛们的 ...

  10. [Leetcode] Longest Consecutive Sequence 略详细 (Java)

    题目参见这里 https://leetcode.com/problems/longest-consecutive-sequence/ 这个题目我感觉很难,看了半天别人写的答案,才明白个所以然.下面的代 ...