2

我花了一整天的時間尋找有關如何在SO中實現Zend_Acl的教程和答案,就像在其他站點一樣。我頭痛了。 :XZend Acl - 模塊,控制器,動作和模型

我看到有人使用它來允許或不允許訪問某些控制器/操作和其他人說這種方式不正確,並且應該允許或不允許基於模型的訪問。呵呵,第二個似乎是可行的,但是,這意味着對於每個控制器我需要一個模型?因爲看起來,在第二種選擇之後,我只能在用戶訪問時立即阻止用戶訪問,例如編輯帖子。但我想阻止訪問編輯帖子的控制器的操作。

如果我想阻止訪問角色X到控制器Z的動作Y的用戶,如果我遵循第二個選擇,我該怎麼做?

一個真正的應用程序的例子將是非常受歡迎的。

此信息可以改善您的答案: 我使用Doctrine 2作爲ORM,並且我有一個模塊Admin。我的應用程序的實際結構是這樣的:

application 
    - MYAPP 
    - configs 
    - controllers 
    - layouts 
    - views 
    - library 
     - MYAPP ;This folder is in the include path 
    - modules 
     - admin 
+0

夥計 - 您需要提供更多信息。您的特定情況的ACL配置是什麼?我期望您添加一些代碼片段,以便我們可以理解您的問題。 – emeraldjava 2011-06-11 21:16:49

+0

@emeraldjava,我沒有實際的ACL配置,就像我說我對各種現有的實現感到困惑。以下是我一直在閱讀的一些鏈接,可以看出,它們遵循不同的路徑:http://weierophinney.net/matthew/archives/201-Applying-ACLs-to-Models.html和http:// stackoverflow.com/questions/2046608/practical-zend-acl-zend-auth-implementation-and-best-practices。 – JCM 2011-06-11 21:56:25

回答

5

我承認是沒有Zend_Acl專家,但對我來說,使用Zend_Acl的本質就是確定的角色,資源和權限。角色通常很明顯。一旦你清楚地確定了資源,特權通常會變得明顯。

對我來說,關鍵是確定資源

在你的情況下,這聽起來像你已明確確定控制器作爲資源。如果您需要更細粒度的訪問控制,則可以將權限定義爲操作。這似乎足夠靈活,以至於即使不需要使用模型的控制器(可能是僅向特定類型的登錄用戶顯示的靜態頁面等)也可以由ACL控制。

可能有些情況下,您發現您的資源/權限「自然」對應於模型/方法。但是,如果控制器/操作更符合您對程序流程和ACL要求的理解,我認爲您不應該強迫您將ACL強制進入該範例。

不是真的直接回答你的問題。更像是忠於你自己閱讀情況的建議。

+0

完全同意,您可以根據模塊(模塊允許/禁止)以不同的資源級別結束,然後對於其他模塊,您可以阻止基於控制器的訪問,然後針對其他模塊和模型上的其他模塊訪問。請不要猶豫爲每個策略構建幾個獨立的Acl對象(並緩存它們)(並且每個模塊有1個策略通常是有用的) – regilero 2011-06-12 08:50:42

+0

感謝您的回覆。@regilero你是說如果我有幾種類型的資源,我需要爲每個資源定義一個acl(一個基於控制器,另一個基於模型)? – JCM 2011-06-12 13:14:19

+0

@Jonathan:是的,你可以,但不是你必須的,但是如果你想應用多層ACL檢查,你應該嘗試使用幾個Acl對象,這樣你就可以保持它們的小,可理解和單元測試(並且可以緩存 - 有時擁有大量規則的大型ACL對象甚至應該按角色分割)。 – regilero 2011-06-14 14:45:14