`
iloveoracle
  • 浏览: 118796 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

[] 实现简单的ACL

    博客分类:
  • java
阅读更多
    终于写完了 呵呵 简单的一个实现
-- acl tables-- 表的结构 `aclresources`drop table if exists `aclresources`;create table if not exists `aclresources` (  `rsid` varchar(64) not null ,  `access` int(4) not null default 0,    `desc` varchar(240) not null default '',  `created_at` int(10) unsigned not null default 1,  `updated_at` int(10) unsigned not null default 0,  primary key  (`rsid`))default charset=utf8 collate=utf8_unicode_ci;-- 表的结构 `aclroles`drop table if exists `aclroles`;create table if not exists `aclroles` (  `id` int(10) unsigned not null auto_increment,  `rolename` varchar(32) not null ,  `durces_aclroles` (  `rsid` varchar(64) not null ,  `role_id` int(10) unsigned not null ,  primary key  (`rsid`,`role_id`))default charset=utf8 collate=utf8_unicode_ci;-- 表的结构 `ref_users_aclroles`drop table if exists `ref_users_aclroles`;create table if not exists `ref_users_aclroles` (  `user_id` int(10) unsigned not null auto_increment,  `role_id` int(10) unsigned not null ,  primary key  (`user_id`,`role_id`))default charset=utf8 collate=utf8_unicode_ci;-- 表的结构 `users`drop table if exists `users`;create table `users` (  `id` int(10) unsigned not null auto_increment,  `email` varchar(128) not null,  `password` varchar(64) not null,  `nickname` varchar(32) not null default '',  `roles` varchar(240) not null default '',  `created_at` int(10) unsigned not null default 1,  `updated_at` int(10) unsigned not null default 0,  primary key  (`id`),  unique key `user_email` (`email`))default charset=utf8 collate=utf8_unicode_ci;
 
php 类
<?php/** * 简单的 acl 权限控制功能 *  * 表定义 *  * 1. 资源定义 	  (rsid,access,desc,created_at,updated_at) * 2. 角色定义 	  (id,rolename,desc,created_at,updated_at) * 3. 资源-角色关联 (rsid,role_id) * 4. 用户-角色关联 (user_id,role_id) *  * 依赖db.php sqlobject.php *  * @author vb2005xu.iteye.com  */class aclbase {	// --- acl 访问授权		/**	 * 不允许任何人访问	 */	const nobody = 0;		/**	 * 允许任何人访问	 */	const everyone = 1;		/**	 * 允许 拥有角色的用户访问	 */	const has_role = 2;		/**	 * 允许 不带有角色的用户访问	 */	const no_role = 3;	/**	 * 在 资源-角色关联 定义的 角色才能访问	 */	const allocate_roles = 4;			// 定义相关的 表名	public $tbresources = 'aclresources';	public $tbroles = 'aclroles';	public $tbrefresourcesroles = 'ref_aclresources_aclroles';	public $tbrefusersroles = 'ref_users_aclroles';		/**	 * 格式化 资源的访问权限并返回	 * 	 * @return int	 */	static function formataccessvalue($access){		static $arr = array(self::nobody,self::everyone,self::has_role,self::no_role,self::allocate_roles);		return in_array($access,$arr) ? $access : self::nobody;	}		/**	 * 创建资源,返回资源记录主键	 * 	 * @param string $rsid	 * @param int $access	 * @param string $desc	 * 	 * @return int	 */	function createresource($rsid,$access,$desc){		if (empty($rsid)) return false;				$resource = array(			'rsid' => $rsid,			'access' => self::formataccessvalue($access),			'desc' => $desc,			'created_at' => current_timestamp		);				return singletablecrud::insert($this->tbresources,$resource);	}		/**	 * 修改资源,返回成功状态	 * 	 * @param array $resource	 * @return int	 */	function updateresource(array $resource){				if (!isset($resource['rsid'])) return false;				$resource['updated_at'] = current_timestamp;				return singletablecrud::update($this->tbresources,$resource,'rsid');	}		/**	 * 删除资源	 * 	 * @param string $rsid	 * @return int	 */	function deleteresource($rsid){		if (empty($rsid)) return false;		return singletablecrud::delete($this->tbresources,array('rsid'=>$rsid));	}		/**	 * 创建角色,返回角色记录主键	 * 	 * @param string $rolename	 * @param string $desc	 * 	 * @return int	 */	function createrole($rolename,$desc){		if (empty($rolename)) return false;				$role = array(			'rolename' => $rolename,			'desc' => $desc,			'created_at' => current_timestamp		);				return singletablecrud::insert($this->tbroles,$role);	}		/**	 * 修改角色,返回成功状态	 * 	 * @param array $role	 * @return int	 */	function updaterole(array $role){				if (!isset($role['id'])) return false;				if (isset($role['rolename'])) unset($role['rolename']);		$role['updated_at'] = current_timestamp;				return singletablecrud::update($this->tbroles,$role,'id');	}		/**	 * 删除角色	 * 	 * @param int $role_id	 * @return int	 */	function deleterole($role_id){		if (empty($role_id)) return false;		return singletablecrud::delete($this->tbroles,array('role_id'=>(int) $role_id));	}		/**	 * 为资源指定角色,每次均先全部移除表中相关记录再插入	 * 	 * @param int $rsid	 * @param mixed $roleids	 * @param boolean $setnull 当角色id不存在时,是否将资源从关联表中清空	 */	function allocaterolesforresource($rsid,$roleids,$setnull=false,$defaultaccess=-1){		if (empty($rsid)) return false;				$roleids = normalize($roleids,',');		if (empty($roleids)){			if ($setnull){				singletablecrud::delete($this->tbrefresourcesroles,array('rsid'=>$rsid));								if ($defaultaccess != -1){					$defaultaccess = self::formataccessvalue($defaultaccess);					$this->updateresource(array('rsid'=>$rsid,'access'=>$defaultaccess));				}				return true; 			}			return false;		}				singletablecrud::delete($this->tbrefresourcesroles,array('rsid'=>$rsid));				$roleids = array_unique($roleids);				foreach ($roleids as $role_id){			singletablecrud::insert($this->tbrefresourcesroles,array('rsid'=>$rsid,'role_id'=>(int)$role_id));		}		return true;	}		function cleanrolesforresource($rsid){		if (empty($rsid)) return false;		return singletablecrud::delete($this->tbrefresourcesroles,array('rsid'=>$rsid));	}		function cleanresourcesforrole($role_id){		if (empty($role_id)) return false;		return singletablecrud::delete($this->tbrefresourcesroles,array('role_id'=>(int) $role_id));	}		/**	 * 为角色分配资源,每次均先全部移除表中相关记录再插入	 * 	 * @param int $role_id	 * @param mixed $rsids	 * 	 * @return boolean	 */	function allocateresourcesforrole($role_id,$rsids){		if (empty($role_id)) return false;				$role_id = (int) $role_id;		$rsids = normalize($rsids,',');		if (empty($rsids)){			return false;				}				singletablecrud::delete($this->tbrefresourcesroles,array('role_id'=>$role_id));				$rsids = array_unique($rsids);				foreach ($rsids as $rsid){			singletablecrud::insert($this->tbrefresourcesroles,array('rsid'=>$rsid,'role_id'=>$role_id));		}		return true;	}		/**	 * 为用户指派角色,每次均先全部移除表中相关记录再插入	 * 	 * 此处在用户很多的时候可能会有性能问题 ... 后面再想怎么优化	 * 	 * @param int $user_id	 * @param mixed $roleids	 * 	 * @return boolean	 */	function allocaterolesforuser($user_id,$roleids){		if (empty($user_id)) return false;				$user_id = (int) $user_id;		$roleids = normalize($roleids,',');		if (empty($roleids)){			return false;				}				singletablecrud::delete($this->tbrefusersroles,array('user_id'=>$user_id));				$roleids = array_unique($roleids);				foreach ($roleids as $roleid){			singletablecrud::insert($this->tbrefusersroles,array('user_id'=>$user_id,'role_id'=>$role_id));		}		return true;	}		/**	 * 清除用户的角色信息	 * 	 * @param int $user_id	 * 	 * @return boolean	 */	function cleanrolesforuser($user_id){		if (empty($user_id)) return false;		return singletablecrud::delete($this->tbrefusersroles,array('user_id'=>(int) $user_id));	}		/**	 * 清除角色的用户关联	 * 	 * @param int $role_id	 * 	 * @return boolean	 */	function cleanusersforrole($role_id){		if (empty($role_id)) return false;		return singletablecrud::delete($this->tbrefusersroles,array('role_id'=>(int) $role_id));	}		}
 
具体 检测的代码 如下:
/** * 对资源进行acl校验 *  * @param string $rsid 资源标识 * @param array $user  特定用户,不指定则校验当前用户 *  * @return boolean */function aclverity($rsid ,array $user = null){		if (empty($rsid)) return false;	if (!coreapp::$defaultacl) {		coreapp::$defaultacl = new aclflat();	}		$rsrow = aclgetresource($rsid);		// 未定义资源的缺省访问策略	if (!$rsrow) return false;		coreapp::writelog($rsrow,'test');		$rsrow['access'] = aclbase::formataccessvalue($rsrow['access']);		// 允许任何人访问	if (aclbase::everyone == $rsrow['access']) return true;		// 不允许任何人访问	if (aclbase::nobody == $rsrow['access']) return false;		// 获取用户信息	if (empty($user)) $user = isset($_session['si-sysuser']) ? $_session['si-sysuser'] : null;		// 用户未登录,则当成无访问权限	if (empty($user)) return false;		$user['roles'] = empty($user['roles']) ? null : normalize($user['roles'],';');		$userhasroles = !empty($user['roles']);		/**	 * 允许 不带有角色的用户访问	 */	if (aclbase::no_role == $rsrow['access']) return $userhasroles ? false : true;		/**	 * 允许 带有角色的用户访问	 */	if (aclbase::has_role == $rsrow['access']) return $userhasroles ? true : false;		// --- 对用户进行 资源 <-> 角色 校验	if ($userhasroles){		foreach ($user['roles'] as $role_id){			if ( aclgetrefresourcesroles($rsid,$role_id) )				return true;		}		dump($user);	}	return false;}
  
 
 
1
0
分享到:
评论

相关推荐

    php中实现简单的ACL 完结篇

    总的来说,这个简单的PHP ACL实现提供了一个基础框架,可以根据项目需求进行扩展,比如添加更复杂的权限模型、支持动态权限分配等。对于初学者来说,这是一个很好的起点,有助于理解权限控制的概念和实现方式。

    acl.zip_ACL_权限控制

    这些文件很可能是用来演示如何通过HTTP GET请求参数实现简单的ACL权限控制。下面将详细解释ACL的概念以及如何在PHP中实现这一功能。 **访问控制列表(ACL)基本概念** 1. **ACL的定义**:访问控制列表是一系列规则...

    网络课程设计--ACL编程实现

    例如,一个简单的ACL规则可能允许特定IP地址的流量,或者阻止特定端口的服务。 Java实现ACL时,可能涉及的关键概念有: 1. **数据结构**:为了存储和查找规则,可能使用了链表、树或哈希表等数据结构,以实现高效...

    思科路由器用自反访问控制列表(ACL)实现网段之间单向访问配置(设置)方法图解.docx

    使用标准 ACL 可以实现简单的单向访问配置,但是这种方法有一定的局限性,例如无法根据端口号来过滤流量。 5. 使用扩展 ACL 实现单向访问配置 使用扩展 ACL 可以实现更加复杂的单向访问配置,例如根据端口号和协议...

    荒城原创动态ACL实现简单上网用户授权

    在动态ACL的实现上,思科提供了相应的解决方案,使得路由器支持基于用户身份的动态访问控制。通过这样的配置,即使是在使用DHCP动态分配IP地址的环境中,网络管理员也能够有效地控制用户对互联网的访问权限。 在...

    ACL和前缀列表区别详解.doc

    例如,在路由器中,可以使用 ACL 来实现简单的路由条目过滤,而在需要精确抓取路由条目的情况下,可以使用前缀列表。此外,在网络安全和防火墙等应用中,ACL 和前缀列表也可以结合使用,以实现更加复杂和精确的路由...

    ACL原理及配置(ACL原理)

    通过使用ACL,网络管理员能够根据特定的标准来过滤网络流量,从而实现精细化的网络管理。 - **作用**: - **过滤流量**: 根据源地址、目的地址、端口号等条件过滤进入或离开路由器的数据包。 - **安全控制**: 控制...

    cisco_acl配置手册

    这类ACL相对简单,但控制粒度较粗,无法识别特定的传输层协议或端口。例如: - 允许特定主机(如172.17.31.222)通过:`access-list 1 permit host 172.17.31.222` - 禁止特定主机通过,允许其他所有主机:`access-...

    标准ACL试验-神码专用

    标准ACL提供了一种简单而有效的方法来控制网络访问,通过精确指定源IP地址,可以实现对网络流量的精细过滤,从而增强网络安全性。然而,由于其只考虑源IP地址,对于需要更复杂过滤规则的情况(如基于协议类型或端口...

    基于时间的ACL配置实例

    该配置实例将指导您如何使用基于时间的ACL来控制网络流量,实现特定的网络安全策略。 时间段定义 在基于时间的ACL配置中,首先需要定义时间段。时间段可以是星期几、工作日、周末或特定的日期范围。使用`time-...

    什么是ACL.pdf

    简单来说,ACL就是一种报文过滤器,它可以根据预设的规则过滤出特定的报文,并根据相应的策略决定是否允许这些报文通过。 **目的** 随着网络技术的发展,网络安全问题日益突出,如企业重要资源被随意访问、病毒侵袭...

    lua and acl example

    3. Access Control Lists (ACL):理解和实现网络或系统中的权限管理,以控制不同用户或服务的访问权限。 4. Thrift框架:利用Thrift实现跨语言的通信,结合Lua和C++进行高效服务开发。 通过深入理解和实践这些知识...

    spring security acl

    - 为了更好地理解和使用Spring Security ACL,可以创建一个简单的示例,如保护一个博客文章,只允许特定用户编辑或删除他们的文章。 - 最佳实践包括合理设计权限层次,避免过度复杂化,以及定期审查和调整权限设置...

    标准ACL控制列表实验

    网络安全采用的技术很多,而通过访问控制列表(ACL)可以对数据流进行过滤,是实现基本的网络安全手段之一。 二、ACL概述 访问控制列表简称为 ACL,它使用包过滤技术,在路由器上读取第三层及第四层包头中的信息...

    网络工程实验 配置标准ACL

    标准ACL(Access Control List)是一种常用的网络访问控制机制,它可以根据预定义的规则对网络中的数据进行过滤,以实现简单的访问控制。在这个实验中,我们将学习如何配置标准IP ACL来实现访问控制。 知识点1:...

    华为H3C-ACL操作手册.pdf

    通过配置ACL,可以实现对网络流量的有效控制,从而提高网络安全性和效率。 **1.1.1 ACL匹配顺序** ACL匹配顺序是理解并正确配置ACL的基础之一。在H3C的设备中,ACL可以通过两种方式进行匹配: 1. **配置顺序**:...

    ACL实验详细图文配置

    ### ACL(访问控制列表)实验图文详细配置 #### 一、引言 访问控制列表(Access Control List,简称ACL)是网络设备上...此外,实验还展示了如何通过简单的配置实现特定的网络策略,这在实际工作中是非常实用的技能。

Global site tag (gtag.js) - Google Analytics