逆向思考之权限模型

之前做过了一个权限控制代码,是根据控制列表(Access Control Lists ACL)来进行控制权限的,但是根据ACL控制列表实际的缺陷非常明显,比如要想拦截一个权限代码,通常的进行匹配节点,然后根据匹配到的节点,拿到具体的项,进行校验,费事切复杂。

今天逆向思维了下,发现竟然有相反的方案,特写代码记录下这种方案。

public function testAcl()
    {
        $acl = new AclList();
        $resources = array('/^https:\/\/(.*).baidu.com\/(.*)/', '/^https:\/\/(.*).google.com\/(.*)/');
        $acl->setDefaultAction(\Phalcon\Acl::DENY);
        $customersResource = new Resource("Customers");
        $acl->addResource($customersResource, $resources);
        $roles = array(
            'guest' => new Role("Guests"),
            'admin' => new Role("Admin")
        );
        foreach ($roles as $role) {
            $acl->addRole($role);
        }
        $acl->allow("Guests", "Customers", $resources[1]);
        $acl->allow('Admin', 'Customers', '*');
        $url = 'https://music.baidu.com/song/")';
        $text = '';
        $match = array();
        for ($i = 0; $i < sizeof($resources); $i++) {
            $isMatch = preg_match($resources[$i], $url, $match);
            if ($isMatch) {
                $text = $resources[$i];
                break;
            }
        }

        print_r($acl->isAllowed("Guests", "Customers", $text) ? '有' : '没有');
    }

  如果按照之前的时候,权限控制列表的需要定义更详细的明细,而现在只需要定义好一个基础的权限结构,通过逆推匹配的正则,通过正则节点的权限即可查看,方便高效。

    所以有时候正着不行逆着来,反而有不错的效果。

 

你可能感兴趣的:(逆向思考之权限模型)