Zend Framework:需要ACL的典型示例

2024-02-18

有人可以指导我 ACL 的典型实施示例吗?就像“管理员”可以访问“管理”模块,“用户”可以访问“用户模块”,访客可以访问“打开”页面。


我可以把我的 ACL 贴给你。它由三个元素组成:acl.ini、ACL 控制器插件 (My_Controller_Plugin_Acl) 和 My_Acl 类以及 USER 表。然而,它不处理模块,而是处理控制器和操作。不过,它可能会让您对 ACL 有一些总体了解。我对 ACL 的使用基于一本名为“Zend Framework in Action”的书中的内容。

用户表(权限字段用于ACL):

CREATE  TABLE IF NOT EXISTS `USER` (
  `user_id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `email` VARCHAR(85) NOT NULL ,
  `password` CHAR(32) NOT NULL,
  `phone` VARCHAR(45) NULL ,
  `phone_public` TINYINT(1) NULL DEFAULT 0 ,     
  `first_name` VARCHAR(45) NULL ,
  `last_name` VARCHAR(45) NULL ,
  `last_name_public` TINYINT(1) NULL DEFAULT 1 ,
  `is_enabled` TINYINT(1) NOT NULL DEFAULT 1 ,
  `created` TIMESTAMP NOT NULL,
  `privilage` ENUM('BASIC','PREMIUM','ADMIN') NOT NULL DEFAULT 'BASIC' ,
  PRIMARY KEY (`user_id`) ,
  UNIQUE INDEX `email_UNIQUE` (`email` ASC) )
ENGINE = InnoDB;

acl.ini(我有四种特权,例如基本权限继承来宾权限,高级权限继承基本权限,高级权限继承管理员权限):

; roles
acl.roles.guest = null
acl.roles.basic = guest
acl.roles.premium = basic
acl.roles.administrator = premium

; resources
acl.resources.deny.all.all = guest


acl.resources.allow.index.all = guest
acl.resources.allow.error.all = guest
acl.resources.allow.user.login = guest
acl.resources.allow.user.logout = guest
acl.resources.allow.user.create = guest

acl.resources.allow.user.index = basic
acl.resources.allow.user.success = basic

My_Acl 类(根据ini文件创建ACL角色和资源):

class My_Acl extends Zend_Acl {

    public function __construct() {
        $aclConfig = Zend_Registry::get('acl');
        $roles = $aclConfig->acl->roles;
        $resources = $aclConfig->acl->resources;
        $this->_addRoles($roles);
        $this->_addResources($resources);
    }

    protected function _addRoles($roles) {

        foreach ($roles as $name => $parents) {
            if (!$this->hasRole($name)) {
                if (empty($parents)) {
                    $parents = null;
                } else {
                    $parents = explode(',', $parents);
                }                    
                $this->addRole(new Zend_Acl_Role($name), $parents);             
            }
        }       
    }

    protected function _addResources($resources) {          

        foreach ($resources as $permissions => $controllers) {         

            foreach ($controllers as $controller => $actions) {
                if ($controller == 'all') {
                    $controller = null;
                } else {
                    if (!$this->has($controller)) {
                        $this->add(new Zend_Acl_Resource($controller));
                    }
                }

                foreach ($actions as $action => $role) {
                    if ($action == 'all') {
                        $action = null;
                    }
                    if ($permissions == 'allow') {
                        $this->allow($role, $controller, $action);
                    }
                    if ($permissions == 'deny') {                           
                        $this->deny($role, $controller, $action);
                    }
                }
            }
        }
    }

}

我的控制器插件Acl:

class My_Controller_Plugin_Acl extends Zend_Controller_Plugin_Abstract {

    /**
     *
     * @var Zend_Auth
     */
    protected $_auth;

    protected $_acl;
    protected $_action;
    protected $_controller;
    protected $_currentRole;

    public function __construct(Zend_Acl $acl, array $options = array()) {
        $this->_auth = Zend_Auth::getInstance();
        $this->_acl = $acl;

    }

   public function preDispatch(Zend_Controller_Request_Abstract $request) {

        $this->_init($request);        

        // if the current user role is not allowed to do something
        if (!$this->_acl->isAllowed($this->_currentRole, $this->_controller, $this->_action)) {

            if ('guest' == $this->_currentRole) {
                $request->setControllerName('user');
                $request->setActionName('login');
            } else {
                $request->setControllerName('error');
                $request->setActionName('noauth');
            }
        }
    }

    protected function _init($request) {
        $this->_action = $request->getActionName();
        $this->_controller = $request->getControllerName();
        $this->_currentRole = $this->_getCurrentUserRole();
    }

    protected function _getCurrentUserRole() {      

        if ($this->_auth->hasIdentity()) {
            $authData = $this->_auth->getIdentity();
            $role = isset($authData->property->privilage)?strtolower($authData->property->privilage): 'guest';
        } else {
            $role = 'guest';
        }

        return $role;
    }

}

最后是 Bootstrap.php 的一部分,其中所有内容都已初始化:

protected function _initLoadAclIni() {
    $config = new Zend_Config_Ini(APPLICATION_PATH . '/configs/acl.ini');
    Zend_Registry::set('acl', $config);
}

protected function _initAclControllerPlugin() {
    $this->bootstrap('frontcontroller');
    $this->bootstrap('loadAclIni');

    $front = Zend_Controller_Front::getInstance();

    $aclPlugin = new My_Controller_Plugin_Acl(new My_Acl());

    $front->registerPlugin($aclPlugin);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Zend Framework:需要ACL的典型示例 的相关文章

  • 指定的控制器无效(错误) - Zend Framework

    我总是收到这个错误 blub libraries Zend Controller Dispatcher Standard php 中出现异常 Zend Controller Dispatcher Exception 消息为 指定的控制器无效
  • Mysql:一般错误:1366 字符串值不正确

    今天 我在开发基于 PHP MySql 和 Zend Framework 的应用程序时遇到错误 此外 我正在使用phpseclib http phpseclib sourceforge net 使用加密数据AES算法 http en wik
  • 如何使用 Zend Framework 和 netbeans 编写 JavaScript?

    我正在这样编写 JavaScript function some javascript magic 但问题是它没有突出显示并且没有自动完成功能 我尝试过这样写
  • 有没有办法在 Zend Framework 1.5 中执行“INSERT...ON DUPLICATE KEY UPDATE”?

    我想用ON DUPLICATE KEY UPDATE在 Zend Framework 1 5 中 这可能吗 Example INSERT INTO sometable VALUES ON DUPLICATE KEY UPDATE 我在 Ze
  • Zend_Forms、控制器放在哪里?模型?别的地方?

    构建 Zend Forms 的代码最好放在哪里 我曾经把这个逻辑放在我的控制器中 但在我需要在不同的地方使用相同的表单后 我就放弃了这个逻辑 这意味着我必须在不同的控制器中重复创建表单 因此 我将表单创建代码移至我的模型中 这看起来正确吗
  • Zend 框架引导问题

    我已经在新安装 Zend Framework 应用程序一段时间了 但我不知道发生了什么 我有两个想要使用的自定义操作助手 并且我想在引导程序中初始化它们 但似乎我的 init 函数根本没有被调用 在启动应用程序的 index php 中 我
  • Zend_Form_Element_MultiCheckbox:如何将一长串复选框显示为列?

    所以我正在使用Zend Form Element MultiCheckbox显示一长串复选框 如果我简单地echo元素 我得到很多由分隔的复选框 br 标签 我想找出一种方法来利用简单性Zend Form Element MultiChec
  • phpunit 测试类未找到错误,而类存在?

    这是我的目录结构 application modules admin models User php 这是我的用户模型类 class admin Model User User php 这是我的 UserTest 类 带有简单的 Asser
  • 使用 Zend Gdata 在 Google 电子表格中插入行时出错

    我正在尝试使用 Zend Gdata 1 11 库在 Google 电子表格中插入行的最简单的可能方案 电子表格的单元格 A1 中有单词 Kolona 这是整个 php 文件
  • 具有 http 身份验证的 Zend SOAP 服务器 WSDL URI

    我正在尝试使用 Zend Soap Server 设置 SOAP 服务 ZF1 我的问题是 WSDL URI 受密码保护 可以通过设置 https 用户名 来访问它 电子邮件受保护 cdn cgi l email protection 作为
  • 由于 zend 路线,zend 导航无法工作

    EDIT 该问题是由于 zend 路由引起的 请检查更新 我正在使用 xml 文件进行导航 编辑 以下代码来自layout phtml文件 config new Zend Config Xml APPLICATION PATH config
  • Zend_Db:如何从表中获取行数?

    我想知道一个表中有多少行 我使用的数据库是MySQL数据库 我已经有一个 Db Table 类 用于像这样的调用fetchAll 但我不需要表中的任何信息 只需要行数 如何在不调用的情况下获得表中所有行的计数fetchAll count d
  • 解析 JSON 到 MySQL 表

    我正在使用 Zend Framework 1 12 我想创建一个基于 JSON 文件的表 我已经创建了表及其字段 现在它们都是长文本 它所要做的就是将它们插入到正确的列中 我遵循了这些例子 http www daniweb com web
  • 日期未保存在mysql数据库中

    我在 MySQL 数据库中保存日期时遇到问题 测试一切 我正在尝试将 2010 01 01 例如 保存在 MySQL 数据库中 首先 我将 MySQL 字段设置为最新 这不起作用 但是当我将字段设置为字符串类型时 它确实将日期保存在数据库中
  • zend框架FlashMessenger问题

    我正在使用 FlashMessenger 助手来设置消息 但无法使用 getMessages 方法检索消息 它返回 null 这是我的示例代码
  • ZF2:如何从自定义类内部获取 ServiceManager 实例

    我无法弄清楚如何从自定义类内部获取 ServiceManager 实例 在控制器内部很简单 this gt getServiceLocator gt get My CustomLogger gt log 5 my message 现在 我创
  • Doctrine2大合集

    在过去的几天里 我一直在玩doctrine2 ZF 设置 我仍然无法弄清楚的一件事是大型数组集合关联 例如 假设我们有一个名为 Post 的实体 每个帖子可以有很多评论 现在 如果我这样做 这将加载所有评论 post gt comments
  • Zend_Controller_Router_Route:找不到翻译器

    我正在开发一个多语言应用程序 在引导程序中有路由设置 protected function initRoutes this gt bootstrap frontController router this gt frontControlle
  • 值得学习的优秀 Zend Framework 示例应用程序 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Spring Security 上的组和 acl

    我想使用 Spring Security 来管理用户 组和权限 我想使用 ACL 来保护我的域对象 但我找不到将组分配给 acl 的方法 例如 我有用户和组 每个组可以拥有以下证券 管理论坛 可以是类似的角色ROLE FORUM MANAG

随机推荐

  • 当 Outlook Web 加载项通过 makeEwsRequestAsync api 发出 GetItem 请求时,接收“ErrorAccessDenied”响应代码

    我们正在使用 Exchange Server 和 Outlook 客户端版本的不同组合来测试 Outlook Web 加载项 该插件使GetItem请求通过makeEwsRequestAsync https dev office com r
  • 使用 Google Maps Javascript API 在我自己的图像上进行捏合缩放

    我正在尝试创建一个适合移动设备的网页 允许用户拖动 img 周围在一个 div 我已经使用了这个工作image ontouchstart方法 现在我想要做到这一点 以便用户在从 iOS 设备查看此内容时可以进行捏合缩放 我当前正在从 iPa
  • 如何配置oauth回调的路由

    我正在使用宝石OAuth2 https github com intridea oauth2与 Google 服务进行通信 我不明白如何实现回调 该回调接收带有 OAuth 代码的响应以获取访问令牌 当我在中设置断点时callback方法
  • 我们可以在 Firestore 中查询多深? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我只是在寻找在 Firestore 上设计数据库的答案 我有根集合的 4 级和 5 级子集合 在这个级
  • Azure 发布管道错误:无法获取 Kudu 应用程序设置。错误:服务暂时不可用(代码:503)

    我有一个 Azure DevOps 发布管道 它将容器部署到 Azure 中的应用程序服务 当我运行它时 部署容器的任务失败并显示消息 2020 10 23T16 12 20 8516547Z 错误 错误 无法获取 Kudu 应用程序设置
  • 使用 Hudson 发布 NUnit 测试结果报告时出现问题

    我在 Hudson 和 NUnit 测试方面遇到问题 当尝试发布 NUnit 的测试结果报告时 Hudson 中的选项 即 发布 NUnit 测试结果报告 会产生问题 我无法提供作业工作区文件夹下已创建的 XML 文件的路径 当我设置文件的
  • 如何配置 persistence.xml 提供者标签

    嘿 我正在学习这些东西 我并没有真正理解所有内容 而且我有一个问题 我不知道在 persistence xml 的提供者标签中写什么 这是我的 persistence xml 和 pom xml 文件 pom xml
  • 如何在运行时将图像加载到WPF?

    在运行时将图像加载到 WPF 窗口似乎相当复杂 Image image image new Uri Bilder sas png UriKind Relative Source new BitmapImage image 我正在尝试这段代码
  • 带百分比标签的 Ggplot 堆积条形图

    I am trying to do a stacked bar plot based on count but with the labels showing the percentage on the plot I have produc
  • 如何在 C++ 中加载共享对象?

    我有一个共享对象 so Windows dll 的 Linux 等效项 我想将其导入并与我的测试代码一起使用 我确信这不是那么简单 但这就是我想做的事情 include headerforClassFromBlah h int main l
  • 如何在 QuickGraph Dijkstra 或 A* 中设置目标顶点

    我使用的是 QuickGraph 3 6 版 我找到了函数 SetRootVertex 但没有 SetTagretVertex 我需要这个 因为我正在巨大的图中搜索短路径 这会大大加快程序速度 有问题的类是 DijkstraShortest
  • C++ 错误:基函数受保护

    我想知道为什么下面的代码不能编译 class base protected typedef void base function type const void function impl const error void base fun
  • 优化字符串连接的聚合[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 Update 对于那些有幽默感的人 您可以假设无论传递给它什么函数 聚合仍然会产生正常结果 包括在被优化的情况下 我编写这个程序是为了构建一
  • DataContract,默认 DataMember 值

    有没有办法在反序列化期间选择不在 xml 文件中的属性的默认值 If the mAgexml 文件中不存在属性 我想使用默认值 18 这可能吗 DataContract public class Person public Person D
  • 如何将触摸事件从 UIView 传递到其下方的 UIView?

    一个简单的问题 但我找不到解决方案 我有 2 个 UIView 一个在同一个父视图中 一个在另一个之上 都有GestureRecognizers在它们上 但只有最顶层正在接收事件 我怎样才能让最上面的视图将他获得的所有手势传递给它下面的其他
  • Golang MySQL 错误 - packet.go:33: 意外的 EOF

    我将整个代码库从 PHP 切换到 Go 在运行的几个进程中 我随机收到此错误 mysql 2016 10 11 09 17 16 packets go 33 unexpected EOF 这是我的 db 包 它处理与数据库的所有连接 pac
  • 有人可以向我解释一些 helm 的用例吗?

    我目前正在使用 kubernetes 并且遇到了 helm 假设我不喜欢用与我的应用程序无关的进程 感染 我的 kubernetes 集群 但如果它有益的话 我很乐意接受 所以我做了一些研究 但我仍然找不到任何使用我的 yaml 描述符和
  • ASP.Net URL 编码

    我正在 ASP net 中实现 URL 重写 但我的 URL 给我带来了很多问题 URL 是根据部门和类别的数据库生成的 我希望员工能够使用任何合适的特殊字符将项目添加到数据库中 而不会破坏网站 我在构建 URL 之前对数据进行编码 有几个
  • Sphinx .net 实现

    是否可以在 net MSSQL 应用程序中实现Sphinx 全文搜索 如果是这样 任何帮助如何实现相同的 一个小的描述将会有很大帮助 我们正在使用 SphinxConnector NET http www sphinxconnector n
  • Zend Framework:需要ACL的典型示例

    有人可以指导我 ACL 的典型实施示例吗 就像 管理员 可以访问 管理 模块 用户 可以访问 用户模块 访客可以访问 打开 页面 我可以把我的 ACL 贴给你 它由三个元素组成 acl ini ACL 控制器插件 My Controller