热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ThinkPHP框架使用ZendACL权限包

由于种种机缘巧合用ZendFramework框架做过一年的项目,所以,对ZF框架的相关的包也有着一定的了解,前些天用TP的RBAC发现要用数据库,而且使用起来也不是很顺手,也许是自己有着偏见的缘故吧..

由于种种机缘巧合用Zend Framework框架做过一年的项目,所以,对ZF框架的相关的包也有着一定的了解,前些天用TP的RBAC发现要用数据库,而且使用起来也不是很顺手,也许是自己有着偏见的缘故吧,于是就放弃了TP提供的RBAC权限,选用了ZEND ACL.

第一步:从Zend官方下载ZF框架包,解压后将里面的Acl包与Acl包同级目录下的Acl.php文件也一起拷贝至TP框架提供的第三方类库目录Vendor/Zend.

第二步:由于在使用ZEND ACL的时候,我使用了ini格式的配置文件,同时也方便ACL读取ini文件,这个地方用到了Zend Config这个包,也将这个包拷贝到Vendor/Zend目录,还有与Config同目录下的Config.php文件也拷贝到Vendor/Zend目录.

第三步:由于这两个包都用到了Zend_Exception这个类,所以,要将Zend目录下的Exception.php文件拷贝到Vendor目录下。

注:为什么要有Zend目录,因为,Acl和Config包都在相互引用类的时候都用到了Zend这个目录,所以,保证程序正常引用,必须将Acl和Config包放在Vendor/Zend目录下.

第四步:配置资源,所谓资源就是我们要进行用ACL管理的资源,只有这些资源才会被ACL进行管理,没有在配置之列的资源将不会适用ACL控制,因为我的程序是使用的分组。所以,在Conf目录下有一个分组目录Admin. Admin目录下我创建了一个acl.ini文件,这个文件用来保存我们要进行控制的资源.

格式如:

;;==========================================

;;访问控制列表(ACL)设置说明:

;;1、resources为资源列表,仅对资源列表中的资源进行控制

;;2、resources格式:自定义名称.键名(任意,但不可用重复)= 模块:控制器

;;3、这里将Zend ACL移动到Thinkphp中来使用,这里配置与Zend里面的配置无二。

;;   admin指的要将此运用到哪个分组[这里Admin分组],如果没有分组是独立的,那么随机设置一个。在ACL类里面自己匹配。

;;   这里必须将'admin:'后面的小写,不管你的操作是大写还是小写,这里都必须小写。

;;==========================================

  1. [ACL] 
  2. ;;====resource资源部分 
  3. resource.index       = Admin:index 
  4. resource.ad          = Admin:ad 
  5. resource.article  = Admin:article 
  6. resource.grievance   = Admin:grievance 
  7. resource.login       = Admin:login 
  8. resource.secret      = Admin:secret 
  9. resource.user     = Admin:user 
  10. resource.common   = Admin:common 

第五步:创建控制类,有了资源,我们还要指定角色与分配资源,因为,一般后台程序或其他管理程序同时会有多个角色进行操作,而每个角色所能操作的权限不同,不同的权限对应的资源也不一样,所以,我们要通过这个类来细化规则,如下:

  1. class AdminAcl 
  2.     // 默认角色 
  3.     private $_defaultRole = 'guest'
  4.     public function __construct()  
  5.     { 
  6.        Vendor('Zend.Acl'); 
  7.        Vendor('Zend.Config.ini'); 
  8.        $this->acl = new Zend_Acl(); 
  9.         
  10.        // 定义了三个角色:默认[游客]角色、客服角色、超级管理员角色。 
  11.        $this->acl->addRole(new Zend_Acl_Role($this->_defaultRole)); 
  12.        $this->acl->addRole(new Zend_Acl_Role('service')); 
  13.        $this->acl->addRole(new Zend_Acl_Role('admin')); 
  14.  
  15.        // 读取配置文件。配置文件指明了需要进行控制的类型。 
  16.        $aclConfig     = new Zend_Config_Ini(APP_PATH . '/Conf/Admin/acl.ini''ACL'); 
  17.         $aclSettings = $aclConfig->toArray(); 
  18.  
  19.         // 添加资源 
  20.         foreach ($aclSettings as $key => $arr) { 
  21.             $this->acl->add(new Zend_Acl_Resource($key)); 
  22.             foreach ($arr as $value){ 
  23.                 $this->acl->add(new Zend_Acl_Resource($value), $key); 
  24.             } 
  25.         } 
  26.  
  27.         // 游客权限,可以访问的资源:这里只能访问登录模块的index 
  28.         // 第三个参数是用户可以访问的操作。 
  29.        $this->acl->allow('guest''Admin:login'array('index')); 
  30.  
  31.        // 客服权限。 
  32.        $this->acl->allow('service''Admin:login'); 
  33.        $this->acl->allow('service''Admin:index'); 
  34.        $this->acl->allow('service''Admin:ad'); 
  35.        $this->acl->allow('service''Admin:article'); 
  36.        $this->acl->allow('service''Admin:grievance'); 
  37.        $this->acl->allow('service''Admin:secret'); 
  38.        //$this->acl->allow('service', 'admin:user'); // 用户管理必须超级管理员。 
  39.        //$this->acl->allow('service', 'admin:common'); 
  40.  
  41.        // 超级管理员可以访问任意资源 
  42.        $this->acl->allow('admin'); 
  43.         
  44.        $this->preDispatch(); 
  45.     } 
  46.      
  47.     public function preDispatch() 
  48.     { 
  49.        $role = $this->_defaultRole; // 默认角色为游客。 
  50.         
  51.        // 首先第一步取用户信息,相关的验证放到这里即可。 
  52.        $is_login = true; 
  53.         
  54.        if ($is_login
  55.        { 
  56.            $userinfo = array('usertype' => 3); 
  57.            if ($userinfo['usertype'] == 1) 
  58.            { 
  59.               $role = 'admin'
  60.            } 
  61.            elseif ($userinfo['usertype'] == 2) 
  62.            { 
  63.               $role = 'service'
  64.            } 
  65.        } 
  66.  
  67.        // 判断角色是否在注册的角色里面。 
  68.        if (!$this->acl->hasRole($role)) 
  69.        { 
  70.            $role = 'guest'
  71.        } 
  72.  
  73.        $group_name  = GROUP_NAME; 
  74.        $module_name = strtolower(MODULE_NAME); 
  75.        $action_name = strtolower(ACTION_NAME); 
  76.        $resource = "$group_name:$module_name"
  77.         
  78.        if (!$this->acl->has($resource)) 
  79.        { 
  80.            $resource = null; 
  81.        } 
  82.  
  83.        // 若是没有权限则将跳转到登录页面。 
  84.        if (!$this->acl->isAllowed($role$resource$action_name)) 
  85.        { 
  86.             redirect(U('Admin-Login/index')); 
  87.        } 
  88.     } 

注:APP_PATH 这个是一个常量,这个常量我在项目入口文件index.php文件中定义了,它的值是入口文件所在目录,这样的话,就相当于当前项目的目录路径,因为我刚才将acl.ini放在了Conf/Admin目录下了.

以上这个类我们放在了项目目录下的Commmon/Admin分组目录下,取名为AdminAcl.class.php.

第六步:在调用任何操作之前调用此控制类,这一步就很简单了,因为,我们在做项目的时候都会把会创建一个CommonAction.class.php文件或类让其他所有的Action继承,所以,这个我在CommonAction类里的_initialize()方法里面进行调用控制类.调用方法如:

  1. public function _initialize() 
  2. import('AdminAcl''Common/Admin'); 
  3.        new AdminAcl(); 

这样每次执行其他Action的时候都会调用执行这个初始化方法,就会自动调用AdminAcl这个资源控制类,就会按照这个类中的preDespatch()方法的规则进行判断控制.

结后语:其实在第五步的时候,最后我们调用了redirect()方法进行跳转,这个方法是TP系统函数,里面的URL地址可以配置在分组配置中,这样达到一个全自动或半自动的效果.

以上用法在ZF里面是非常常见的,如果TP使用不到,那在ZF框架里面一定会用到.


推荐阅读
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • Redis API
    安装启动最简启动命令行输入验证动态参数启动配置文件启动常用配置通用命令keysbdsize计算key的总数exists判断是否存在delkeyvalue删除指定的keyvalue成 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 006_Redis的List数据类型
    1.List类型是一个链表结构的集合,主要功能有push,pop,获取元素等。List类型是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素,List的设 ... [详细]
  • 单点登录原理及实现方案详解
    本文详细介绍了单点登录的原理及实现方案,其中包括共享Session的方式,以及基于Redis的Session共享方案。同时,还分享了作者在应用环境中所遇到的问题和经验,希望对读者有所帮助。 ... [详细]
  • 本文介绍了Redis中RDB文件和AOF文件的保存和还原机制。RDB文件用于保存和还原Redis服务器所有数据库中的键值对数据,SAVE命令和BGSAVE命令分别用于阻塞服务器和由子进程执行保存操作。同时执行SAVE命令和BGSAVE命令,以及同时执行两个BGSAVE命令都会产生竞争条件。服务器会保存所有用save选项设置的保存条件,当满足任意一个保存条件时,服务器会自动执行BGSAVE命令。此外,还介绍了RDB文件和AOF文件在操作方面的冲突以及同时执行大量磁盘写入操作的不良影响。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 一次上线事故,30岁+的程序员踩坑经验之谈
    本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
  • 本文介绍了关系型数据库和NoSQL数据库的概念和特点,列举了主流的关系型数据库和NoSQL数据库,同时描述了它们在新闻、电商抢购信息和微博热点信息等场景中的应用。此外,还提供了MySQL配置文件的相关内容。 ... [详细]
  • 2021最新总结网易/腾讯/CVTE/字节面经分享(附答案解析)
    本文分享作者在2021年面试网易、腾讯、CVTE和字节等大型互联网企业的经历和问题,包括稳定性设计、数据库优化、分布式锁的设计等内容。同时提供了大厂最新面试真题笔记,并附带答案解析。 ... [详细]
  • 本文整理了Java中java.lang.NoSuchMethodError.getMessage()方法的一些代码示例,展示了NoSuchMethodErr ... [详细]
  • python中安装并使用redis相关的知识
    本文介绍了在python中安装并使用redis的相关知识,包括redis的数据缓存系统和支持的数据类型,以及在pycharm中安装redis模块和常用的字符串操作。 ... [详细]
author-avatar
gogo迷失的大G
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有