一个完整的使用实例(将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. Java :内部类基础详解

    可以将一个类的定义放在另一个类的定义内部,这就是内部类. 第一次见面 内部类我们从外面看是非常容易理解的,无非就是在一个类的内部在定义一个类. public class OuterClass { pr ...

  2. TypeMismatchException: Provided id of the wrong type for class zhongfucheng.user.entity.User.

    今天在使用SSH框架做项目的时候出现了这个错误,找了我非常非常多的时间!!!!!!! Struts Problem Report Struts has detected an unhandled ex ...

  3. .net异步性能测试(包括ASP.NET MVC WebAPI异步方法)

    很久没有写博客了,今年做的产品公司这两天刚刚开了发布会,稍微清闲下来,想想我们做的产品还有没有性能优化空间,于是想到了.Net的异步可以优化性能,但到底能够提升多大的比例呢?恰好有一个朋友正在做各种语 ...

  4. springboot+swagger2

    springboot+swagger2 小序 新公司的第二个项目,是一个配置管理终端机(比如:自动售卖机,银行取款机)的web项目,之前写过一个分模块的springboot框架,就在那个框架基础上进行 ...

  5. 一步一步带你做WebApi迁移ASP.NET Core2.0

    随着ASP.NET Core 2.0发布之后,原先运行在Windows IIS中的ASP.NET WebApi站点,就可以跨平台运行在Linux中.我们有必要先说一下ASP.NET Core. ASP ...

  6. 【模版】AC自动机(简单版)

    题目背景 这是一道简单的AC自动机模版题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保证正确的基础上只有两组数据,请不要恶意提交. 题目描述 给定n个模式串和1个文本串,求有多少个模式串在文本 ...

  7. Two-phase clustering process for outliers detection 文章翻译

    基于二阶段聚集模式的异常探测 M.F .Jiang, S.S. Tseng *, C.M. Su 国立交通大学计算机与信息科学系,中国台北市新竹路100150号 1999年11月17日; 2000年4 ...

  8. 浅谈Java多态

    什么是Java中的多态?又是一个纸老虎的概念,老套路,把它具体化,细分化,先想三个问题(注意,这里不是简单的化整为零,而是要建立在学习一个新概念时的思考框架): 1.这个东西有什么用?用来干什么的?它 ...

  9. Recall(召回率)and Precision(精确率)

    ◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/7668501.html 前言 机器学习中经过听到" ...

  10. DevOps之主机

    唠叨话 关于德语噢屁事的知识点,仅提供专业性的精华汇总,具体知识点细节,参考教程网址,如需帮助,请留言. 主机(Host) 关于主机,知识与技能的层次(知道.理解.运用),理论与实践的方面(原理.技术 ...