访问控制列表ACL

一个完整的使用实例(将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"));

时间: 2024-10-27 06:40:03

访问控制列表ACL的相关文章

ORACLE 11G 存储过程发送邮件(job),ORA-24247:网络访问被访问控制列表 (ACL) 拒绝

ORA-24247:网络访问被访问控制列表 (ACL) 拒绝 需要先使用 DBMS_NETWORK_ACL_ADMIN.CREATE_ACL 创建访问控制列表(ACL),再使用 DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL 将此 ACL 与邮件服务器相关联,最后使用 DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE 在此 ACL 为用户授与连接邮件服务器的权限. BEGINDBMS_NETWORK_ACL_ADMIN.CREATE_ACL (acl 

Linux权限、组管理和访问控制列表(ACL)

一.用户组管理 创建组 groupad命令: groupadd [OPTION]... group_name     -g GID: 指明GID号:[GID_MIN,GID_MAX]     -r: 创建系统组: CentOS 6: ID<500 CentOS 7:ID<1000 组属性修改 groupmod命令: groupmod [OPTION]... group_name     -g:GID,改变组id     -n:改变组名 groupmod -n mutest mysystem g

IIS中遇到无法预览的问题(HTTP 错误 401.3 - Unauthorized 由于 Web 服务器上此资源的访问控制列表(ACL)配置或加密设置,您无权查看此目录或页面。)

在IIS中  依次执行如下操作: 网站--编辑权限--共享(为了方便可以直接将分享对象设置为everyone)--安全(直接勾选 everyone )--应用--确定. IIS中遇到无法预览的问题(HTTP 错误 401.3 - Unauthorized 由于 Web 服务器上此资源的访问控制列表(ACL)配置或加密设置,您无权查看此目录或页面.)

文件的权限和访问控制列表(ACL)

前言 文件的权限以及访问控制列表贯穿在整个的Linux使用过程中.我们知道,在Linux 中一切皆文件,因而文件的权限,就自然而然地成为了Linux使用过程中需要频繁接触到的知识内容.而文件权限这一部分地内容,又非常地复杂,因为我们将在这篇文章当中详细地介绍文件的权限,加深自己的理解,同时留作备忘. 本文将通过以下几个方面的内容来介绍文件的权限. 1.文件权限 主要介绍文件的权限,以及每种权限代表着哪些含义. 2.修改文件权限  介绍如何修改文件的权限 3.Linux 系统上特殊文件权限 介绍L

【华为HCNA】访问控制列表ACL实例配置

[华为HCNA]访问控制列表ACL实例配置 ACL的概念访问控制列表ACL(Access Control List)可以定义一系列不同的规则,设备根据这些规则对数据包进行分类,并针对不同类型的报文进行不同的处理,从而可以实现对网络访问行为的控制.限制网络流量.提高网络性能.防止网络攻击等等. 应用场景在小型企业的网络中,现要求只有经理的PC(源地址是192.168.2.1)才能访问互联 实验目的允许主机B(经理的PC)访问互联网,禁止主机A访问互联网 网络拓扑图如下: 操作步骤 一.配置端口类型

Azure终结点访问控制列表ACL

对于公有云来说,用户最关心的莫过于安全方面的问题了.借助本文,我们来了解下Azure中的访问控制列表. 首先我们来看下什么是终结点访问控制列表ACL? 终结点访问控制列表 (ACL) 是可用于 Azure 部署的安全增强. 利用 ACL,可以选择允许还是拒绝虚拟机终结点的流量. 此数据包筛选功能额外提供了一层安全性. 只能为终结点指定网络 ACL, 无法为虚拟网络或虚拟网络中包含的特定子网指定 ACL. 建议尽可能使用网络安全组 (NSG),而不要使用 ACL. 使用网络 ACL 可以实现以下目

通信导论-访问控制列表ACL原理

访问控制列表ACL:当网络流量不断增长的时候,对数据流进行管理和限制的方法,允许或拒绝数据指令(设置ACL规则前测试网络连通性) 访问控制列表的功能 限制网络流量,提高网络性能 提供对通信流量的控制手段 提供网络访问的基本安全手段 ACL类型 标准ACL:仅以源IP地址为过滤标准 扩展ACL:以源IP地址.目的IP地址.TCP/UDP源端口号等为过滤标准 二层ACL 混合ACL 应用ACL,区分in和out的方向 inbound:进入路由表接口的方向 outbound:出路由表接口的方向 ACL

“TI门外汉”网路知识笔记十一 访问控制列表ACL(1标准访问列表)

访问控制列表(Access Control List,ACL) 是路由器和交换机接口的指令列表,用来控制端口进出的数据包.ACL适用于所有的被路由协议,如IP.IPX.AppleTalk等. ACL的作用: ACL可以限制网络流量.提高网络性能. ACL提供对通信流量的控制手段. ACL是提供网络安全访问的基本手段. ACL可以在路由器端口处决定哪种类型的通信流量被转发或被阻塞. 3P 原则: 在路由器上应用 ACL 的一般规则.您可以为每种协议 (per protocol).每个方向 (per

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

前面几节我们介绍了路由器的路由配置,接下来几节我们将介绍路由器的高级配置应用,包括ACL.NAT.DHCP.PPP.VPN和远程连接等的配置.     (1)ACL概述:   ACL(Access Control List)是一系列运用到路由器接口的指令列表.这些指令告诉路由器如何接收和丢弃数据包,按照一定的规则进行,如源地址.目的地址和端口号等.路由器将根据ACL中指定的条件,对经过路由器端口的数据包进行检查,ACL可以基于所有的Routed Protocols(被路由协议)对经过路由器的数据

访问控制列表ACL的配置与应用

访问控制列表(Access Control List,ACL)是应用在路由器接口的指令列表(即规则).这些指令列表用来告诉路由器,哪些数据包可以接收,哪些数据包需要拒绝.其基本原理如下:ACL使用包过滤技术,在路由器上读取OSI七层模型的第三层及第四层包头中的信息,如源地址.目的地址.源端口.目的端口等,根据预先定义好的规则,对包进行过滤,从而达到访问控制的目的. ACL通过在路由器接口处控制数据包的转发还是丢弃,从而过滤通信流量.路由器根据ACL中指定的条件来检测通过路由器的数据包,从而决定是