成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

PHP框架Phalcon 之 ACL

mikyou / 2041人閱讀

摘要:一般至少要在執(zhí)行路由前要判斷用戶是否具有權(quán)限一般在中,所以應(yīng)該在它之前獲得填充。以下代碼可參考這里的方法就是重點(diǎn)。參考這里把對象保存在中。

使用如下圖解釋這個組件:

實際最終真正要使用的是access_list(ACL),但是這個ACL的填充的場景一般是在后臺,先添加具體的role,然后添加resource以及resource_list(一般resource以及resource_list是固定的,因為這兩個東西一般對應(yīng)控制器和控制器的動作),再然后針對role設(shè)置access_list,每條access_list組成有roles_name、resources_name、access_name、allowed,檢查某個用戶(屬于某個role)是否可以執(zhí)行某控制器和動作,就檢查對應(yīng)的控制器和動作在列表中它的allowed的值。如果access_list已經(jīng)設(shè)置好了,在檢查用戶權(quán)限這個步驟,完全可以只使用access_list。PhalconAclAdapter抽象類要求所有的適配器都要提供添加角色,添加資源,添加訪問列表,判斷權(quán)限等功能。

對于角色繼承,比如有角色A和B,B繼承A,如果要獲取A的ACL,只要去access_list查詢roles_name為A的記錄即可,如果是B,則要查詢roles_name為A和B的記錄。

從邏輯上看,role,roles_inherits, resource, resource_access應(yīng)不是ACL對象的組成部分,但是由于要管理這些資源,所有提供了對應(yīng)方法。

//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");
    

一般至少要在執(zhí)行路由前要判斷用戶是否具有權(quán)限(一般在beforeDispatch中),所以ACL應(yīng)該在它之前獲得填充。以下代碼可參考:

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()方法就是重點(diǎn)。參考:

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;
}

這里把a(bǔ)cl對象保存在persistent中。

所有角色 資源 訪問列表這些應(yīng)該是要可配置并且是要保存起來的。但是Phalcon當(dāng)前只提供PhalconAclAdapterMemory適配器,在它實例化后你需要手動填充它,資源訪問列表可以來自數(shù)據(jù)庫等,然后可以把這個對象緩存起來,https://github.com/phalcon/in...中提供了一個保存到數(shù)據(jù)庫的適配器,它可以根據(jù)數(shù)據(jù)表自動填充,可以調(diào)用相關(guān)方法添加資源、角色、訪問列表,而這些如果使用PhalconAclAdapterMemory,那么就要自己去實現(xiàn)。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/31886.html

相關(guān)文章

  • Phalcon入門教程目錄結(jié)構(gòu)

    摘要:原文發(fā)表于入門教程之目錄結(jié)構(gòu)很多初學(xué)的朋友,對于以框架為基礎(chǔ)構(gòu)建的項目,應(yīng)該如何組織目錄結(jié)構(gòu)有點(diǎn)摸不著頭腦。只需要通過注冊這些目錄結(jié)構(gòu),即可正常使用。 原文發(fā)表于:Phalcon入門教程之目錄結(jié)構(gòu) 很多初學(xué)Phalcon的朋友,對于以Phalcon框架為基礎(chǔ)構(gòu)建的項目,應(yīng)該如何組織目錄結(jié)構(gòu)有點(diǎn)摸不著頭腦。比如多模塊的項目中,如何共用libs類庫和models目錄中模型類的情況,就有很...

    reclay 評論0 收藏0
  • 我為什么要開發(fā)一個 MixPHP 框架

    摘要:異步隊列消費(fèi)者開發(fā)只提供了模式下運(yùn)行控制器方法,并未提供主進(jìn)程多子進(jìn)程的進(jìn)程模型,并未提供多線程處理。多線程異步隊列服務(wù)只需寫好控制器方法,然后在配置文件中配置下路由命名空間進(jìn)程線程數(shù)量,就可在模式中啟動多進(jìn)程多線程模型的異步隊列處理程序。 最近業(yè)余時間一直在開發(fā)ExpressPHP的第二個版本 MixPHP,今天下班想起之前一個面試官的問題:你為什么還要再造一個輪子呢?仔細(xì)回想,第一...

    SnaiLiu 評論0 收藏0
  • PHP7 安裝Phalcon框架

    摘要:是什么是開源全功能棧使用擴(kuò)展編寫針對高性能優(yōu)化的框架。也是松耦合的,可以根據(jù)項目的需要任意使用其他對象。安裝支持版本的不支持普通方式的編譯安裝,只能通過安裝。因此安裝之前,請先安裝。 Phalcon 是什么? Phalcon 是開源、全功能棧、使用 C 擴(kuò)展編寫、針對高性能優(yōu)化的 PHP 5 框架。 開發(fā)者不需要學(xué)習(xí)和使用 C 語言的功能, 因為所有的功能都以 PHP 類的方式暴露出來...

    kidsamong 評論0 收藏0
  • Phalcon 使用自定義的類

    摘要:在框架中使用自定義的類是再常見不過的事情,框架套路大多一致。這里說下中,使用自定義類的方法。 在框架中使用自定義的類是再常見不過的事情,框架套路大多一致。這里說下Phalcon中,使用自定義類的方法。 1.創(chuàng)建一個目錄 路徑可以放在app下也可以放在根目錄下,譬如,放在根目錄下,文件夾名叫demo 2.注冊命名空間 不知道命名空間為何物的自行Google,打開app/config/l...

    frank_fun 評論0 收藏0
  • PhpStorm下提示Phalcon框架語法

    摘要:下載源碼源碼地址下載下載源碼地址下載修改文件,指定生成語法文件到目前為止,會在目錄下生成對應(yīng)版本的目錄在中導(dǎo)入最后重啟 1、下載Phalcon源碼 git clone https://github.com/phalcon/cphalcon.git 源碼地址:下載 2、下載phalcon-devtools git clone https://github.com/phalcon/phal...

    luckyw 評論0 收藏0

發(fā)表評論

0條評論

mikyou

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<