[转]CodeIgniter与Zend Acl结合实现轻量级权限控制
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用于控制权限角色非常方便……如有不明之处请与本人联系。
QQ:603031225 DJBLOG:http://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结合实现轻量级权限控制的更多相关文章
- CodeIgniter与Zend Acl结合实现轻量级权限控制
CodeIgniter与Zend Acl结合实现轻量级权限控制 Tag :CodeIgniter Zend Acl 权限控制 1. Zend_Acl简介 Zend_Acl 为权限管理提供轻量并灵活的访 ...
- zookeeper ACL(access control lists)权限控制
基本作用: 针对节点可以设置 相关读写等权限,目的为了保障数据安全性 权限permissions可以制定不同的权限范围以及角色 一:ACL构成 zk的acl ...
- **CodeIgniter通过hook的方式实现简单的权限控制
根据自己的实际情况,需要两个文件,一个是权限控制类,Acl,另外一个是权限配置的文件acl.php放在了config这个目录下. Acl这个类放在了application/hook/acl.php.通 ...
- 轻量级权限管理系统(renren-security)
renren-security是一个轻量级权限管理系统,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.使用renren-security搭建项目,只需编写30%左右代码,其余的代码交给系统自动生 ...
- phalcon: acl权限控制
目录控制: public/index.php: $di['aclResource']=function(){ return include_once '../app/config/frontbackA ...
- linux下通过acl配置灵活目录文件权限(可用于ftp,web服务器的用户权限控制)
linux下通过acl配置灵活目录文件权限(可用于ftp,web服务器的用户权限控制) 发表于2012//07由feng linux 本身的ugo rwx的权限,对于精确的权限控制很是力不从心的,ac ...
- zookeeper的ACL权限控制
ACL:Access Control List 访问控制列表 1. 简介 0.概述 ACL 权限控制,使用:scheme:id:perm 来标识,主要涵盖 3 个方面: 权限模式(Scheme): ...
- Linux系统——ACL权限控制及特殊权限
ACL权限控制 ACL(access control list),可以提供除属主.属组.其他人的rwx权限之外的细节权限设定 ACL的权限控制 (1)User 使用者 (2)Group 群组 (3)M ...
- phalcon: 目录分组后的acl权限控制
phalcon: 目录分组后的acl权限控制 楼主在做acl权限的时候,发现官方的acl只能针对未分组的目录,如下: app/ ___|./controller ___|./logic ___|./p ...
随机推荐
- MongoDB分片技术[转]
8天学通MongoDB——第六天 分片技术 在mongodb里面存在另一种集群,就是分片技术,跟sql server的表分区类似,我们知道当数据量达到T级别的时候,我们的磁盘,内存 就吃不消了,针 ...
- [Angular 2] Injecting a Service
Using Services in Angular 2 is very simple. This lesson covers how to create a simple class as a Ser ...
- 单片机脚本语言-移植lua到stm32-MDK
Lua简单介绍 Lua[1] 是一个小巧的脚本语言.作者是巴西人.该语言的设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能. Lua脚本能够非常easy的被C/C++ 代码调用, ...
- iocfont 网页图标字体以及使用方法
在网页设计中使用图标字体(icon font)是件挺有新意的事情,使用图标字体能我们带来了一定的方便,比如在移动设备.Retina屏幕效果展示.兼容IE6/7浏览器以及能任意将图标放大缩小等,这些都是 ...
- 使用css3属性,大部分浏览器要识别前缀
例如以下代码的解析 -ms-transform:rotate(7deg); -moz-transform:rotate(7deg); -webkit-transform:rotate(7deg); - ...
- Jquery:Jquery中的DOM操作<二>
由于昨天晚上回来的晚,写的有点匆忙,所以昨天的学习笔记中出现了多处错误的地方,幸好有各位园友帮忙指出,在这里谢过各位了!今天继续学习关于Jquery中DOM的操作,其实是昨天随笔的延续,求围观!!! ...
- 初识数据字典【weber出品必属精品】
数据字典结构 有两部分组成: 1. 基表:以$结尾的系统表,在创建数据库的时候,oracle自动创建的表 2. 用户可以访问的视图 数据字典的种类 DICTIONARY:简称DICT,所有的数据字典, ...
- ssh maven 搭建
数据库建表脚本不带,是很简单的一个表,把数据库环境搭建起来即可. 1.项目结构(Eclipse) 2.pom.xml <project xmlns="http://maven.apac ...
- bootstrap小结
bootstrap总结 bootstrap总结 base css 我分为了几大类 1,列表 .unstyled(无样式列表),.dl-horizontal(dl列表水平排列) 2,代码 code(行级 ...
- 根据文字计算Label的尺寸
CGSize size = [self.username.text boundingRectWithSize:(CGSize){130,20} options:NSStringDrawingUsesL ...