摘要:一般至少要在執(zhí)行路由前要判斷用戶是否具有權(quán)限一般在中,所以應(yīng)該在它之前獲得填充。以下代碼可參考這里的方法就是重點(diǎn)。參考這里把對(duì)象保存在中。
使用如下圖解釋這個(gè)組件:
實(shí)際最終真正要使用的是access_list(ACL),但是這個(gè)ACL的填充的場(chǎng)景一般是在后臺(tái),先添加具體的role,然后添加resource以及resource_list(一般resource以及resource_list是固定的,因?yàn)檫@兩個(gè)東西一般對(duì)應(yīng)控制器和控制器的動(dòng)作),再然后針對(duì)role設(shè)置access_list,每條access_list組成有roles_name、resources_name、access_name、allowed,檢查某個(gè)用戶(屬于某個(gè)role)是否可以執(zhí)行某控制器和動(dòng)作,就檢查對(duì)應(yīng)的控制器和動(dòng)作在列表中它的allowed的值。如果access_list已經(jīng)設(shè)置好了,在檢查用戶權(quán)限這個(gè)步驟,完全可以只使用access_list。PhalconAclAdapter抽象類要求所有的適配器都要提供添加角色,添加資源,添加訪問(wèn)列表,判斷權(quán)限等功能。
對(duì)于角色繼承,比如有角色A和B,B繼承A,如果要獲取A的ACL,只要去access_list查詢r(jià)oles_name為A的記錄即可,如果是B,則要查詢r(jià)oles_name為A和B的記錄。
從邏輯上看,role,roles_inherits, resource, resource_access應(yīng)不是ACL對(duì)象的組成部分,但是由于要管理這些資源,所有提供了對(duì)應(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對(duì)象保存在persistent中。
所有角色 資源 訪問(wèn)列表這些應(yīng)該是要可配置并且是要保存起來(lái)的。但是Phalcon當(dāng)前只提供PhalconAclAdapterMemory適配器,在它實(shí)例化后你需要手動(dòng)填充它,資源訪問(wèn)列表可以來(lái)自數(shù)據(jù)庫(kù)等,然后可以把這個(gè)對(duì)象緩存起來(lái),https://github.com/phalcon/in...中提供了一個(gè)保存到數(shù)據(jù)庫(kù)的適配器,它可以根據(jù)數(shù)據(jù)表自動(dòng)填充,可以調(diào)用相關(guān)方法添加資源、角色、訪問(wèn)列表,而這些如果使用PhalconAclAdapterMemory,那么就要自己去實(shí)現(xiàn)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/31886.html
摘要:原文發(fā)表于入門(mén)教程之目錄結(jié)構(gòu)很多初學(xué)的朋友,對(duì)于以框架為基礎(chǔ)構(gòu)建的項(xiàng)目,應(yīng)該如何組織目錄結(jié)構(gòu)有點(diǎn)摸不著頭腦。只需要通過(guò)注冊(cè)這些目錄結(jié)構(gòu),即可正常使用。 原文發(fā)表于:Phalcon入門(mén)教程之目錄結(jié)構(gòu) 很多初學(xué)Phalcon的朋友,對(duì)于以Phalcon框架為基礎(chǔ)構(gòu)建的項(xiàng)目,應(yīng)該如何組織目錄結(jié)構(gòu)有點(diǎn)摸不著頭腦。比如多模塊的項(xiàng)目中,如何共用libs類庫(kù)和models目錄中模型類的情況,就有很...
摘要:異步隊(duì)列消費(fèi)者開(kāi)發(fā)只提供了模式下運(yùn)行控制器方法,并未提供主進(jìn)程多子進(jìn)程的進(jìn)程模型,并未提供多線程處理。多線程異步隊(duì)列服務(wù)只需寫(xiě)好控制器方法,然后在配置文件中配置下路由命名空間進(jìn)程線程數(shù)量,就可在模式中啟動(dòng)多進(jìn)程多線程模型的異步隊(duì)列處理程序。 最近業(yè)余時(shí)間一直在開(kāi)發(fā)ExpressPHP的第二個(gè)版本 MixPHP,今天下班想起之前一個(gè)面試官的問(wèn)題:你為什么還要再造一個(gè)輪子呢?仔細(xì)回想,第一...
摘要:是什么是開(kāi)源全功能棧使用擴(kuò)展編寫(xiě)針對(duì)高性能優(yōu)化的框架。也是松耦合的,可以根據(jù)項(xiàng)目的需要任意使用其他對(duì)象。安裝支持版本的不支持普通方式的編譯安裝,只能通過(guò)安裝。因此安裝之前,請(qǐng)先安裝。 Phalcon 是什么? Phalcon 是開(kāi)源、全功能棧、使用 C 擴(kuò)展編寫(xiě)、針對(duì)高性能優(yōu)化的 PHP 5 框架。 開(kāi)發(fā)者不需要學(xué)習(xí)和使用 C 語(yǔ)言的功能, 因?yàn)樗械墓δ芏家?PHP 類的方式暴露出來(lái)...
摘要:在框架中使用自定義的類是再常見(jiàn)不過(guò)的事情,框架套路大多一致。這里說(shuō)下中,使用自定義類的方法。 在框架中使用自定義的類是再常見(jiàn)不過(guò)的事情,框架套路大多一致。這里說(shuō)下Phalcon中,使用自定義類的方法。 1.創(chuàng)建一個(gè)目錄 路徑可以放在app下也可以放在根目錄下,譬如,放在根目錄下,文件夾名叫demo 2.注冊(cè)命名空間 不知道命名空間為何物的自行Google,打開(kāi)app/config/l...
摘要:下載源碼源碼地址下載下載源碼地址下載修改文件,指定生成語(yǔ)法文件到目前為止,會(huì)在目錄下生成對(duì)應(yīng)版本的目錄在中導(dǎo)入最后重啟 1、下載Phalcon源碼 git clone https://github.com/phalcon/cphalcon.git 源碼地址:下載 2、下載phalcon-devtools git clone https://github.com/phalcon/phal...
閱讀 3684·2021-10-09 09:44
閱讀 3344·2021-09-22 15:29
閱讀 3115·2019-08-30 15:54
閱讀 3018·2019-08-29 16:19
閱讀 2142·2019-08-29 12:50
閱讀 594·2019-08-26 14:04
閱讀 1696·2019-08-23 18:39
閱讀 1344·2019-08-23 17:59