资讯专栏INFORMATION COLUMN

PHP框架Phalcon 之 ACL

mikyou / 1806人阅读

摘要:一般至少要在执行路由前要判断用户是否具有权限一般在中,所以应该在它之前获得填充。以下代码可参考这里的方法就是重点。参考这里把对象保存在中。

使用如下图解释这个组件:

实际最终真正要使用的是access_list(ACL),但是这个ACL的填充的场景一般是在后台,先添加具体的role,然后添加resource以及resource_list(一般resource以及resource_list是固定的,因为这两个东西一般对应控制器和控制器的动作),再然后针对role设置access_list,每条access_list组成有roles_name、resources_name、access_name、allowed,检查某个用户(属于某个role)是否可以执行某控制器和动作,就检查对应的控制器和动作在列表中它的allowed的值。如果access_list已经设置好了,在检查用户权限这个步骤,完全可以只使用access_list。PhalconAclAdapter抽象类要求所有的适配器都要提供添加角色,添加资源,添加访问列表,判断权限等功能。

对于角色继承,比如有角色A和B,B继承A,如果要获取A的ACL,只要去access_list查询roles_name为A的记录即可,如果是B,则要查询roles_name为A和B的记录。

从逻辑上看,role,roles_inherits, resource, resource_access应不是ACL对象的组成部分,但是由于要管理这些资源,所有提供了对应方法。

//acl object
$acl = new PhalconAclAdapterMemory();
$acl->setDefaultAction(PhalconAcl::DENY);
 
//role name description
$roleAdmins = new PhalconAclRole("Admin","Super-User role");        
$roleGuests = new PhalconAclRole("Guests");
$acl->addRole($roleGuests);
 
//roles_inhelit roles_name roles_inherit
$acl->addRole($roleAdmins, $roleGuests);
 
//resource name description
//resource_accesses resources_name access_name
$customersResource = new PhalconAclResource("Customers");
$acl->addResource($customersResource,array("search","edit"));
 
//access_list roles_name resources_name access_name
$acl->allow("Admin","Customers","search");
 
//check acl
//echo $acl->isAllowed("Admin","Customers","edit");
echo $acl->isAllowed("Admin","Customers","update");
    

一般至少要在执行路由前要判断用户是否具有权限(一般在beforeDispatch中),所以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) {
        $this->flash->error("You don"t have access to this module");
        $dispatcher->forward(
            array(
                "controller" => "index",
                "action" => "index"
            )
        );
        return false;
    }
}

这里的getAcl()方法就是重点。参考:

public function getAcl() {
    if (!isset($this->persistent->acl)) {
  
        $acl = new PhalconAclAdapterMemory();
 
        $acl->setDefaultAction(PhalconAcl::DENY);
 
        //Register roles
        $roles = array(
            "users"  => new PhalconAclRole("Users"),
            "guests" => new PhalconAclRole("Guests")
        );
        foreach ($roles as $role) {
             $acl->addRole($role);
        }
 
        //Private area resources
        $privateResources = array(
            "companies"    => array("index", "search", "new", "edit", "save", "create", "delete"),
            "products"     => array("index", "search", "new", "edit", "save", "create", "delete"),
            "producttypes" => array("index", "search", "new", "edit", "save", "create", "delete"),
            "invoices"     => array("index", "profile")
    );
        foreach ($privateResources as $resource => $actions) {
            $acl->addResource(new PhalconAclResource($resource), $actions);
        }
 
        //Public area resources
        $publicResources = array(
            "index"   => array("index"),
            "about"   => array("index"),
            "session" => array("index", "register", "start", "end"),
            "contact" => array("index", "send")
        );
        foreach ($publicResources as $resource => $actions) {
            $acl->addResource(new PhalconAclResource($resource), $actions);
        }
 
        //Grant access to public areas to both users and guests
        foreach ($roles as $role) {
            foreach ($publicResources as $resource => $actions) {
                $acl->allow($role->getName(), $resource, "*");
            }
        }
 
        //Grant acess to private area to role Users
        foreach ($privateResources as $resource => $actions) {
            foreach ($actions as $action){
                $acl->allow("Users", $resource, $action);
            }
        }
 
        //The acl is stored in session, APC would be useful here too
        $this->persistent->acl = $acl;
    }
 
    return $this->persistent->acl;
}

这里把acl对象保存在persistent中。

所有角色 资源 访问列表这些应该是要可配置并且是要保存起来的。但是Phalcon当前只提供PhalconAclAdapterMemory适配器,在它实例化后你需要手动填充它,资源访问列表可以来自数据库等,然后可以把这个对象缓存起来,https://github.com/phalcon/in...中提供了一个保存到数据库的适配器,它可以根据数据表自动填充,可以调用相关方法添加资源、角色、访问列表,而这些如果使用PhalconAclAdapterMemory,那么就要自己去实现。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/31886.html

相关文章

  • Phalcon入门教程目录结构

    摘要:原文发表于入门教程之目录结构很多初学的朋友,对于以框架为基础构建的项目,应该如何组织目录结构有点摸不着头脑。只需要通过注册这些目录结构,即可正常使用。 原文发表于:Phalcon入门教程之目录结构 很多初学Phalcon的朋友,对于以Phalcon框架为基础构建的项目,应该如何组织目录结构有点摸不着头脑。比如多模块的项目中,如何共用libs类库和models目录中模型类的情况,就有很...

    reclay 评论0 收藏0
  • 我为什么要开发一个 MixPHP 框架

    摘要:异步队列消费者开发只提供了模式下运行控制器方法,并未提供主进程多子进程的进程模型,并未提供多线程处理。多线程异步队列服务只需写好控制器方法,然后在配置文件中配置下路由命名空间进程线程数量,就可在模式中启动多进程多线程模型的异步队列处理程序。 最近业余时间一直在开发ExpressPHP的第二个版本 MixPHP,今天下班想起之前一个面试官的问题:你为什么还要再造一个轮子呢?仔细回想,第一...

    SnaiLiu 评论0 收藏0
  • PHP7 安装Phalcon框架

    摘要:是什么是开源全功能栈使用扩展编写针对高性能优化的框架。也是松耦合的,可以根据项目的需要任意使用其他对象。安装支持版本的不支持普通方式的编译安装,只能通过安装。因此安装之前,请先安装。 Phalcon 是什么? Phalcon 是开源、全功能栈、使用 C 扩展编写、针对高性能优化的 PHP 5 框架。 开发者不需要学习和使用 C 语言的功能, 因为所有的功能都以 PHP 类的方式暴露出来...

    kidsamong 评论0 收藏0
  • Phalcon 使用自定义的类

    摘要:在框架中使用自定义的类是再常见不过的事情,框架套路大多一致。这里说下中,使用自定义类的方法。 在框架中使用自定义的类是再常见不过的事情,框架套路大多一致。这里说下Phalcon中,使用自定义类的方法。 1.创建一个目录 路径可以放在app下也可以放在根目录下,譬如,放在根目录下,文件夹名叫demo 2.注册命名空间 不知道命名空间为何物的自行Google,打开app/config/l...

    frank_fun 评论0 收藏0
  • PhpStorm下提示Phalcon框架语法

    摘要:下载源码源码地址下载下载源码地址下载修改文件,指定生成语法文件到目前为止,会在目录下生成对应版本的目录在中导入最后重启 1、下载Phalcon源码 git clone https://github.com/phalcon/cphalcon.git 源码地址:下载 2、下载phalcon-devtools git clone https://github.com/phalcon/phal...

    luckyw 评论0 收藏0

发表评论

0条评论

mikyou

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<