一个完整的使用实例(将acl封装成一个插件使用):

use Phalcon\Acl;
use Phalcon\Acl\Role;
use Phalcon\Acl\Resource;
use Phalcon\Events\Event;
use Phalcon\Mvc\User\Plugin;
use Phalcon\Mvc\Dispatcher;
use Phalcon\Acl\Adapter\Memory as AclList; class SecurityPlugin extends Plugin
{
//返回一个已存在的或新创建的acl列表
public function getAcl()
{
if(!isset($this->persistent->acl)) { $acl = new AclList();
//设置默认访问级别为“拒绝”
$acl->setDefaultAction(Acl::DENY); //添加角色
$roles = array(
'users' => new Role('Users'),
'guests' => new Role('Guests')
);
foreach($roles as $role) {
$acl->addRole($role);
} //添加私有资源
$privateResources = array(
'posts' => array('post'),
'comments' => array('comment')
);
foreach($privateResources as $resource => $actions) {
$acl->addResource(new Resource($resource),$actions);
} //添加公有资源
$publicResources = array(
'index' => array('index'),
'register' => array('index'),
'login' => array('index','start','end'),
'posts' => array('index','detail')
);
foreach($publicResources as $resource => $actions) {
$acl->addResource(new Resource($resource),$actions);
} //公有资源访问控制
foreach($roles as $role) {
foreach($publicResources as $resource => $actions) {
foreach($actions as $action) {
$acl->allow($role->getName(),$resource,$action);
}
}
} //私有资源访问控制
foreach($privateResources as $resource => $actions) {
foreach($actions as $action) {
$acl->allow('Users',$resource,$action);
}
}
$this->persistent->acl = $acl;
}
return $this->persistent->acl;
} //查询acl列表进行权限控制
public function beforeDispatch(Event $event,Dispatcher $dispatcher)
{
$auth = $this->session->get('auth');
if(!$auth) { //查询当前用户的身份
$role = 'Guests';
} else {
$role = 'Users';
} $controller = $dispatcher->getControllerName();
$action = $dispatcher->getActionName(); $acl = $this->getAcl(); $allowed = $acl->isAllowed($role,$controller,$action); if($allowed != Acl::ALLOW) { //需要用户登录才有权限
$dispatcher->forward(array(
'controller' => 'login',
'action' => 'index'
));
$this->session->destroy();
return false;
}
}
} 在注入调度控制器时绑定到一个事件控制器中:
$di->set('dispatcher',function() use ($di) { $eventsManager = new EventsManager; $eventsManager->attach('dispatch:beforeDispatch',new SecurityPlugin); $dispatcher = new Dispatcher;
$dispatcher->setEventsManager($eventsManager); return $dispatcher;
});

这样每次从一个方法跳转到另一个方法之前程序都会先去查询一下权限控制列表,看看用户对即将跳转的方法是否有访问权限,若没有权限则跳转到插件中指定的方法。

此外,还可以使用继承机制来构造更复杂的角色,只需要在添加角色的函数的第二个参数中写上要继承的那个角色的实例即可:

// 创建角色

$roleAdmins = new Role("Administrators", "Super-User role");

$roleGuests = new Role("Guests");

// 添加 "Guests" 到 ACL

$acl->addRole($roleGuests);

// 使Administrators继承Guests的访问权限

$acl->addRole($roleAdmins, $roleGuests);

为了提高性能, Phalcon\Acl 的实例可以被实例化到APC, session, 文本或数据库中:

// 保存实例化的数据到文本文件中

file_put_contents("app/security/acl.data", serialize($acl));

// 返序列化

$acl = unserialize(file_get_contents("app/security/acl.data"));

phalcon——访问控制列表ACL的更多相关文章

  1. 由于 web 服务器上此资源的访问控制列表(acl)配置或加密设置,您无权查看此目录或页面。

    场景:IIS中遇到无法预览的有关问题(HTTP 异常 401.3 - Unauthorized 由于 Web 服务器上此资源的访问控制列表(ACL)配置或加密设置 IIS中遇到无法预览的问题(HTTP ...

  2. 用访问控制列表(ACL)实现包过滤

      用访问控制列表(ACL)实现包过滤 一.ACL概述 1.ACL(Access Control List,访问控制列表)是用来实现数据包识别功能的 2.ACL可以应用于诸多方面 a>.b包过滤 ...

  3. 第10章 网络安全(5)_访问控制列表ACL

    6. 访问控制列表ACL 6.1 标准访问控制列表 (1)标准ACL ①标准ACL是基于IP数据包的源IP地址作为转发或是拒绝的条件.即,所有的条件都是基于源IP地址的. ②基本不允许或拒绝整个协议组 ...

  4. 基本的访问控制列表ACL配置

    摘要: 访问控制列表ACL (Access Control L ist)是由permit或 deny语句组成的一系列有顺序的规则集合,这些规则根据数据包的源地址.目的地址.源端口.目的端口等信息  来 ...

  5. HCNA Routing&Switching之访问控制列表ACL

    前文我们了解了DHCP服务相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15147870.html:今天我们来聊一聊访问控制列表ACL: ACL(ac ...

  6. 网络访问控制列表ACL(读懂这篇就基本够了,后面有配置案例)

    一.访问控制列表是什么? 访问控制列表(ACL)是一种基于包过滤的访问控制技术,它可以根据设定的条件对接口上的数据包进行过滤,允许其通过或丢弃.访问控制列表被广泛地应用于路由器和三层交换机,借助于访问 ...

  7. CCNA网络工程师学习进程(8)访问控制列表ACL

    前面几节我们介绍了路由器的路由配置,接下来几节我们将介绍路由器的高级配置应用,包括ACL.NAT.DHCP.PPP.VPN和远程连接等的配置.     (1)ACL概述:   ACL(Access C ...

  8. windows访问控制列表 --ACL(Access Control List)

    1.定义 ACL是一个windows中的表示用户(组)权限的列表. Access Control List(ACL) Access Control Entry(ACE) ... 2.分类 ACL分为两 ...

  9. Linux 系统访问控制列表ACL

    常见的文件系统的一般权限(rwx).特殊权限(SUID,SGID,STICK).隐藏权限(chattr)其实有个共性——权限是针对某一类用户设置的.而如果希望对某个指定的用户进行单独的权限控制,那么就 ...

随机推荐

  1. 从GO内存模型与调用协议理解defer closure的坑

    资料参考: 官网defer介绍: https://blog.golang.org/defer-panic-and-recover 深入解析go: 多值返回: https://tiancaiamao.g ...

  2. 《MySQL必知必会》[03] 表数据的增删改

    1.增:插入数据 INSERT关键字可以插入新的行到数据库表中: 插入完整的行 插入行的一部分 插入多行 插入某些查询的结果 基本的INSERT语句是: INSERT INTO R(A1, A2, . ...

  3. IDEA运行编译后配置文件无法找到,或配置文件修改后无效的问题

    1.触发事件 今天正好在学习log4j,为了测试其配置文件log4j.properties中的各种配置,进行了频繁修改和程序启动以确认效果,因为是使用的IDEA建立的Web项目,接着问题就来了,配置文 ...

  4. 如何手动获取Spring容器中的bean(ApplicationContextAware 接口)

    ApplicationContextAware 接口的作用 先来看下Spring API 中对于 ApplicationContextAware 这个接口的描述:   即是说,当一个类实现了这个接口之 ...

  5. Linux 常用命令之二

    整理以前学习Linux的笔记. 查找目录.查看当前所在路径.新建文件.查看文件内容.修改文件内容.压缩文件操作.搜索命令.管道命令.查看进程.终止进程.查看端口. 7,命令find--查找目录 fin ...

  6. 压缩感知中的lp球:p范数最优化为什么总会导致一个稀疏的解的原因

    转自:彬彬有礼. 压缩感知中的lp球:p范数最优化为什么总会导致一个稀疏的解的原因 http://blog.csdn.net/jbb0523/article/details/40268943 题目: ...

  7. python 脚本开发实战-当当亚马逊图书采集器转淘宝数据包

    开发环境python2.7.9 os:win-xp exe打包工具pyinstaller 界面tkinter ============================================= ...

  8. web.xml中servlet-mapping的配置

    <servlet-mapping>元素在Servlet和URL样式之间定义一个映射.它包含了两个子元素<servlet- name>和<url-pattern>,& ...

  9. 《Go in action》读后记录:Go的并发与并行

    本文的主要内容是: 了解goroutine,使用它来运行程序 了解Go是如何检测并修正竞争状态的(解决资源互斥访问的方式) 了解并使用通道chan来同步goroutine 一.使用goroutine来 ...

  10. 21.Linux-写USB键盘驱动(详解)

    本节目的: 根据上节写的USB鼠标驱动,来依葫芦画瓢写出键盘驱动 1.首先我们通过上节的代码中修改,来打印下键盘驱动的数据到底是怎样的 先来回忆下,我们之前写的鼠标驱动的id_table是这样: 所以 ...