热门标签 | 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框架里面一定会用到.


推荐阅读
  • 本文介绍了数据库体系的基础知识,涵盖关系型数据库(如MySQL)和非关系型数据库(如MongoDB)的基本操作及高级功能。通过三个阶段的学习路径——基础、优化和部署,帮助读者全面掌握数据库的使用和管理。 ... [详细]
  • 本文详细介绍了在 Windows 7 系统中配置 Nginx 1.10.3 和 PHP 7.1.1 NTS 的步骤,包括修改 PHP 配置文件、处理依赖项以及创建批处理脚本启动和停止服务。重点解释了如何解决常见的运行时错误。 ... [详细]
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
  • Spring Cloud学习指南:深入理解微服务架构
    本文介绍了微服务架构的基本概念及其在Spring Cloud中的实现。讨论了微服务架构的主要优势,如简化开发和维护、快速启动、灵活的技术栈选择以及按需扩展的能力。同时,也探讨了微服务架构面临的挑战,包括较高的运维要求、分布式系统的复杂性、接口调整的成本等问题。最后,文章提出了实施微服务时应遵循的设计原则。 ... [详细]
  • 前言无论是对于刚入行工作还是已经工作几年的java开发者来说,面试求职始终是你需要直面的一件事情。首先梳理自己的知识体系,针对性准备,会有事半功倍的效果。我们往往会把重点放在技术上 ... [详细]
  • C#设计模式学习笔记:观察者模式解析
    本文将探讨观察者模式的基本概念、应用场景及其在C#中的实现方法。通过借鉴《Head First Design Patterns》和维基百科等资源,详细介绍该模式的工作原理,并提供具体代码示例。 ... [详细]
  • 本文详细介绍了如何在不同操作系统和设备上设置和配置网络连接的IP地址,涵盖静态和动态IP地址的设置方法。同时,提供了关于路由器和机顶盒等设备的IP配置指南。 ... [详细]
  • Android Studio 安装与配置指南
    本教程详细介绍了如何下载并安装 Android Studio,包括设置 SDK 路径和优化启动性能的方法。通过这些步骤,您可以顺利地开始开发 Android 应用。 ... [详细]
  • 深入解析Spring Cloud微服务架构与分布式系统实战
    本文详细介绍了Spring Cloud在微服务架构和分布式系统中的应用,结合实际案例和最新技术,帮助读者全面掌握微服务的实现与优化。 ... [详细]
  • Redis 中的 Fork 机制与 Copy-On-Write 技术
    本文探讨了 Redis 在执行快照操作时如何利用 fork 创建子进程,并通过 Copy-On-Write 机制高效地管理内存资源。fork 调用的独特之处在于它仅被调用一次,却能在父进程和子进程中分别返回不同的值。 ... [详细]
  • win10个性化打不开如何解决
    本篇内容主要讲解“win10个性化打不开如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“win ... [详细]
  • 在 Redis 中,整数集合(IntSet)主要用于存储有序的整数集合。当集合中的所有元素均为整数且集合长度不超过512时,Redis 会自动使用 IntSet 来提高效率和节省内存。本文将详细介绍 IntSet 的结构及其工作原理。 ... [详细]
  • 本文探讨了大型服务端开发过程中常见的几个误区,包括异步任务处理不当、日志同步模式使用、网络操作未设置超时、缓存命中率及响应时间未统计、单一缓存模式、分布式缓存加锁不当以及团队管理上的误区,旨在帮助开发者避免这些常见错误。 ... [详细]
  • 字节跳动夏季招聘面试经验分享
    本文详细记录了字节跳动夏季招聘的面试经历,涵盖了一、二、三轮面试的技术问题及项目讨论,旨在为准备类似面试的求职者提供参考。 ... [详细]
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
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社区 版权所有